提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。
如果看了我发的线程和进程的知识点的朋友,如果发散思维能力很强,那么可能会出现一个,就是我操作线程和进程的方法很low,导致两个问题
一是如果有很多需要创建的线程或进程一个一个的创建那要累死,而写for循环也不好控制
二是我写的操作方法,貌似只能操作普通的函数,而对于类的方法来说就是个灾难,因为会受self参数的影响,不传吧,报错,传吧,不知道传什么
所以在这篇博文中对操作线程和进程做一个补充,首先之前我操作的方法,是为了初学者能够直接看明白,但其实在正经开发中我们不会那样使用,我们会使用池
下面看一下怎么使用进程池,并且在类中使用!!!!解决大家对self的疑惑
import multiprocessing
import os,timeclass Stu :def pri(self):print('--------进程',os.getpid(),'开始执行代码')time.sleep(2)print('--------进程',os.getpid(),'结束执行')def run(self) :#创建一个进程池,最多有6进程pool = multiprocessing.Pool(6)#循环,模拟向进程池中提交任务,直接通过self传递for i in range(10) :pool.apply_async(self.pri)#关闭池不在接收新的进程,一定要先关闭,不然提交动作会导致停止不了线程池pool.close()#等待池中的进程执行完毕,程序彻底结束,一定要调用这个方法,不然程序直接就是结束了pool.join()if __name__ == '__main__' :stu = Stu()stu.run()结果:
--------进程 4220 开始执行代码
--------进程 12500 开始执行代码
--------进程 9880 开始执行代码
--------进程 7028 开始执行代码
--------进程 696 开始执行代码
--------进程 11832 开始执行代码
--------进程 4220 结束执行
--------进程 12500 结束执行
--------进程 4220 开始执行代码
--------进程 12500 开始执行代码
--------进程 9880 结束执行
--------进程 696 结束执行
--------进程 7028 结束执行
--------进程 9880 开始执行代码
--------进程 696 开始执行代码
--------进程 11832 结束执行
--------进程 4220 结束执行
--------进程 12500 结束执行
--------进程 696 结束执行
--------进程 9880 结束执行
对普通方法使用进程池就不演示了,毕竟和之前的操作原理是一样的
下面看一下如何操作线程池,同样的直接演示在类中操作
from concurrent.futures import ThreadPoolExecutor,waitclass Stu :def myInfe(self) :print('-------')def run(self) :#创建一个线程池executor = ThreadPoolExecutor(max_workers=2)#提交一个任务task1 = executor.submit(self.myInfe)wait([task1])#这个方法的任务参数必须是列表if __name__ == '__main__' :stu = Stu()stu.run()
上面这个是Python直接可以使用的线程池模块,我也给大家找了一个资源,详细的介绍了怎么使用它,大家有兴趣可以看看–》Python官方线程池的使用
但是大家注意,在Python开发中还有一种线程池,这个线程池不是Python直接自带的,你想要使用需要另外下载一个threadpool的包才可以,使用方法如下
import threadpooldef ThreadFun(arg1,arg2): print(arg1+arg2)def main(): device_list=[(1,2),(3,4),(5,6)]#准备参数task_pool=threadpool.ThreadPool(2)#2是线程池中最大线程的个数 request_list=[]#存放任务列表 #首先构造任务列表 for device in device_list: request_list.append(threadpool.makeRequests(ThreadFun,device))#将每个任务放到线程池中,等待线程池中线程各自读取任务,然后进行处理,使用了map函数,不了解的可以去了解一下。 [ task_pool.putRequest(re) for re in request_list] #等待所有任务处理完成,则返回,如果没有处理完,则一直阻塞 task_pool.poll()main()