Python使用multiprocessing实现多线程

原创 阁主  2026-02-19 20:18:54  阅读 1721 次 评论 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。

if __name__ == '__main__':
    # 防止打包exe导致内存溢出
    multiprocessing.freeze_support()

代码实现

实现同时启动4个子进程,然后如果有一个子进程运行结束后再启动一个新的子进程。使进程池的数量一直是保持4个进程运行

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/282.html
版权声明:本文为原创文章,版权归 阁主 所有,欢迎分享本文,转载请保留出处!
免责申明:有些内容源于网络,没能联系到作者。如侵犯到你的权益请告知,我们会尽快删除相关内容。
NEXT:已经是最新一篇了

评论已关闭!