vlambda博客
学习文章列表

自动化脚本多线程并发执行

导读

我们在自动执行脚本时候,希望快速看到执行后的报告,为了达到这个目的,我们引入多了多线程。但是多线程也有同步执行和异步执行,如果要缩短我们脚本的执行时间,那就需要脚本并行执行。我们使用multiprocessing模块来实现

——多线程并发执行

01

multiprocessing模块介绍

python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。

Python提供了multiprocessing

 multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似

02

核心方法介绍

Process

Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,可用来开启一个子进程

参数介绍:

group参数未使用,值始终为None

target表示调用对象,即子进程要执行的任务

args表示调用对象的位置参数元组,args=(1,2,'mike',)

kwargs表示调用对象的字典,kwargs={'name':'mike','age':18}

name为子进程的名称

Queue

Queue与Pipe相类似,都是先进先出的结构。但Queue允许多个进程放入,多个进程从队列取出对象。Queue使用

mutiprocessing.Queue(maxsize)创建,maxsize表示队列中可以存放对象的最大数量

Pipe

Pipe可以是单向(half-duplex),也可以是双向(duplex)。我们通过

mutiprocessing.Pipe(duplex=False)创建单向管道 (默认为双向)。一个进程从PIPE一端输入对象,然后被PIPE另一端的进程接收,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入

Lock

多进程资源控制访问,锁的使用

为了保证进程间的同步,我们可以使用 Lock 类给线程或者进程加锁。Lock 返回的是一个非递归锁对象,Lock 实际上是一个工厂函数。它返回由默认上下文初始化的 multiprocessing.synchronize.Lock 对象


03

综合使用示例

实现多线程并发访问页面,同时循环读取列表数据进行访问,最后实现截图,代码如下

from selenium import webdriver
import multiprocessing
import os
from time import sleep
def details_page_open():
   id = 

{'3X55iyP19vp', '14040278', '25264541', '10079253', '10039494', '10014432', '10007199', '10002386', '13237660',
  '12543815'}#访问页面id列表
   for i in id:#实现循环读取id数据
       try:
           #图片存储位置
           BASE_DIR =

 os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
           MEDIA_ROOT =

os.path.join(BASE_DIR,'picture').replace('/', '\\')  

# 指定上传文件的绝对路径-存储文件
           driver = webdriver.Firefox()
           driver.implicitly_wait(10)
      driver.get("url"+i+".html")
           driver.maximize_window()
           sleep(1)        driver.get_screenshot_as_file(MEDIA_ROOT+'\\'+ i +'.png')
           driver.close()
       except Exception as e:
           print(e)

def proc1(pipe):
   pipe.send(details_page_open())
def proc2(pipe):
   pipe.send(details_page_open())

if __name__=='__main__':
   for i in range(100):
       multiprocessing.freeze_support()
       pipe=multiprocessing.Pipe()                  P1=multiprocessing.Process

       (target=proc1,args=(pipe[0],))
       P2=multiprocessing.Process

       (target=proc2, args=(pipe[1],))
       P1.start()
       P2.start()
       P2.join()
       P1.join()

总结

介绍多线程并行的使用场景,然后我们引入python的multiprocessing模块,并对其中核心的方法原理进行了介绍。最后使用了一个综合示例,来介绍multiprocessing模块来实现多线程并行的实现页面访问和截图

——成长足迹

原创不易,请小伙伴们随手转发和分享,谢谢

自动化脚本多线程并发执行

致努力奋斗的小伙伴们

 

扫码关注我喔