python多进程使用函数封装实例
我就废话不多说了,直接看代码吧!
importmultiprocessingasmp frommultiprocessingimportProcess classMyProcess(Process): """ 自定义多进程,继承自原生Process,目的是获取多进程结果到queue """ def__init__(self,func,args,q): super(MyProcess,self).__init__() self.func=func self.args=args self.res='' self.q=q #self._daemonic=True #self._daemonic=True defrun(self): self.res=self.func(*self.args) self.q.put((self.func.__name__,self.res)) defuse_multiprocessing(func_list): #os.system('exportPYTHONOPTIMIZE=1')#解决daemonicprocessesarenotallowedtohavechildren问题 q=mp.Queue()#队列,将多进程结果存入这里,进程间共享,多进程必须使用multiprocessing的queue proc_list=[] res=[] forfuncinfunc_list: proc=MyProcess(func['func'],args=func['args'],q=q) proc.start() proc_list.append(proc) forpinproc_list: p.join() whilenotq.empty(): r=q.get() res.append(r) returnres
使用时候,将需要多进程执行的函数和函数的参数当作字段,组成个list传给use_multiprocessing方法即可
补充知识:python一个文件里面多个函数同时执行(多进程的方法,并发)
看代码吧!
#coding=utf-8 importtime fromseleniumimportwebdriver importthreading deffun1(a): printa deffun2(): print222 threads=[] threads.append(threading.Thread(target=fun1,args=(u'爱情买卖',))) threads.append(threading.Thread(target=fun2)) print(threads) if__name__=='__main__': fortinthreads: t.setDaemon(True)#我拿来做selenium自动化模拟多个用户使用浏览器的时候,加了这个就启动不了,要去掉 t.start() importthreading
首先导入threading模块,这是使用多线程的前提。
threads=[] t1=threading.Thread(target=fun1,args=(u'爱情买卖',)) threads.append(t1)
创建了threads数组,创建线程t1,使用threading.Thread()方法,在这个方法中调用music方法target=music,args方法对music进行传参。把创建好的线程t1装到threads数组中。
接着以同样的方式创建线程t2,并把t2也装到threads数组。
fortinthreads: t.setDaemon(True) t.start()
最后通过for循环遍历数组。(数组被装载了t1和t2两个线程)
setDaemon()
setDaemon(True)将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print"allover%s"%ctime()后,没有等待子线程,直接就退出了,同时子线程也一同结束。
start()
开始线程活动。
后记:
搞了个并发浏览器操作,
如果要做参数化,用ddt会导致所有行为都在一个浏览器操作,去掉ddt框架后,并发正常
以上这篇python多进程使用函数封装实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。