自动化脚本多线程并发执行
导读
我们在自动执行脚本时候,希望快速看到执行后的报告,为了达到这个目的,我们引入多了多线程。但是多线程也有同步执行和异步执行,如果要缩短我们脚本的执行时间,那就需要脚本并行执行。我们使用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模块来实现多线程并行的实现页面访问和截图
——成长足迹
原创不易,请小伙伴们随手转发和分享,谢谢
致努力奋斗的小伙伴们
扫码关注我喔