Python使用multiprocessing实现多线程 原创 阁主 2022-11-08 09:52:09 阅读 1325 次 评论 1 条 摘要:又是学习的一天,今天学习Python的多线程,千里之行始于足下!大部分谈多进程,都会提多核cpu,这给初学者或小白一个错觉。就是只有多核cpu才能够多进程。我就这样,因为这个错觉,认为自己的电脑2核,只能处理两个进程,进而觉得多进程没有实际作用,而放弃使用多进程。可实际上cpu核数和多进程没有必然联系。单核cpu也可以处理多进程。进程只是更高级的线程,可以理解成对线程的包装和组合。cpu在处理线程和进程时,都是用切换来实现。只是多核就不用切换频繁,效率更高。 ## 工作方式 **apply():**阻塞主进程, 并且一个一个按顺序地执行子进程, 等到全部子进程都执行完毕后 ,继续执行apply()后面主进程的代码 **apply_async():**非阻塞异步的, 他不会等待子进程执行完毕, 主进程会继续执行, 他会根据系统调度来进行进程切换 **join()的作用: **在进程中可以阻塞主进程的执行, 直到等待子线程全部完成之后, 才继续运行主线程后面的代码 ## freeze_support()介绍 Python多进程multiprocessing在windows的Dos或者idle下运行不了会报错。打包成exe包双击之后会一直打开exe,导致内存溢出。在linux下没有问题。在Pycharm下运行也不会有问题,只要在main入口下添加 multiprocessing.freeze_support()就可以解决这个bug。 ```python if __name__ == '__main__': # 防止打包exe导致内存溢出 multiprocessing.freeze_support() ``` ## 代码实现 实现同时启动4个子进程,然后如果有一个子进程运行结束后再启动一个新的子进程。使进程池的数量一直是保持4个进程运行 ```python import time import multiprocessing def fun_c(id): print('进程(%d)开始' % (id)) time.sleep(1) print('进程(%d)结束' % (id)) if __name__ == '__main__': print('主进程开始') # 防止打包exe导致内存溢出 multiprocessing.freeze_support() # 创建4个子进程 p = multiprocessing.Pool(4) count = 0 while True: p.apply_async(fun_c, args=(count,)) count += 1 p.close() p.join() print('主进程结束') ``` ![多线程测试结果](https://www.mainblog.cn/zb_users/upload/2022/11/202211081014556339725.png) 本文地址:https://www.mainblog.cn/282.html 版权声明:本文为原创文章,版权归 阁主 所有,欢迎分享本文,转载请保留出处! 免责申明:有些内容源于网络,没能联系到作者。如侵犯到你的权益请告知,我们会尽快删除相关内容。 PREVIOUS:HBuilder X [微信小程序开发者工具] × initialize NEXT:Git安装、Git Gui和Gui Bash汉化 文章导航