博客
关于我
Python multiprocessing使用详解
阅读量:798 次
发布时间:2023-03-06

本文共 2604 字,大约阅读时间需要 8 分钟。

multiprocessing包是Python中用于多进程管理的核心库,与threading.Thread类似,但它利用多进程的方式运行更高效的任务。它支持通过multiprocessing.Process对象创建进程,类似于Thread,但功能更强大。Process对象提供start()、run()、join()等方法,与Thread类似,但运行的任务可以在Python程序内部编写的函数中执行。

Pipe和Queue

multiprocessing包提供了高效的进程间通信机制,包括Pipe和Queue类。Pipe是单向或双向的通信通道,可以用于进程间传输数据。创建一个双向的Pipe实例,通过send()方法向一端发送数据,另一端的进程可以接收并读取数据。

例如:

import multiprocessing as muldef proc1(pipe):    pipe.send('hello')    print('proc1 rec:', pipe.recv())def proc2(pipe):    print('proc2 rec:', pipe.recv())    pipe.send('hello, too')pipe = mul.Pipe()p1 = mul.Process(target=proc1, args=(pipe[0],))p2 = mul.Process(target=proc2, args=(pipe[1],))p1.start()p2.start()p1.join()p2.join()

运行结果:

proc2 rec: helloproc1 rec: hello, too

Queue则是一个先进先出的消息队列,支持多个进程同时读取和写入数据。Queue的创建方式类似于Pipe,可以指定最大存储容量。

进程池

进程池(Process Pool)允许我们同时启动多个进程来执行任务。通过Pool类,我们可以轻松管理多个进程,提高任务处理效率。

例如:

import multiprocessing as muldef f(x):    return x ** 2if __name__ == '__main__':    pool = mul.Pool(5)    results = pool.map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])    print(results)

运行结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

共享内存

为了实现进程间的共享,multiprocessing包提供了共享内存的功能。我们可以通过Manager类创建共享的内存对象,如Value、Array、dict等。

例如:

import multiprocessingdef func1(a, arr):    a.value = 3.14    for i in range(len(arr)):        arr[i] = 0    a.value = 0if __name__ == '__main__':    num = multiprocessing.Value('d', 1.0)    arr = multiprocessing.Array('i', range(10))    p = multiprocessing.Process(target=func1, args=(num, arr))    p.start()    p.join()    print(num.value)    print(arr[:])

运行结果:

0.0[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Manager

Manager类用于共享资源。它支持多种共享数据类型,包括Value、Array、dict、list、Lock、Semaphore等。Manager可以帮助我们轻松地在多进程间共享数据。

例如:

from multiprocessing import Process, Managerdef func1(shareList, shareValue, shareDict, lock):    with lock:        shareValue.value += 1        shareDict[1] = '1'        shareDict[2] = '2'        for i in range(len(shareList)):            shareList[i] += 1if __name__ == '__main__':    manager = Manager()    list1 = manager.list([1, 2, 3, 4, 5])    dict1 = manager.dict()    array1 = manager.Array('i', range(10))    value1 = manager.Value('i', 1)    lock = manager.Lock()    processes = [Process(target=func1, args=(list1, value1, dict1, lock)) for _ in range(20)]        for p in processes:        p.start()    for p in processes:        p.join()        print(list1)    print(dict1)    print(array1)    print(value1)

运行结果:

[21, 22, 23, 24, 25]{1: '1', 2: '2'}array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])Value('i', 21)

multiprocessing包为Python提供了强大的多进程管理功能,适用于需要高效并行处理任务的场景。通过合理使用Pipe、Queue、进程池、共享内存和Manager等功能,可以实现多进程之间的高效通信与资源共享。

转载地址:http://soafk.baihongyu.com/

你可能感兴趣的文章
Pycharm终端中conda无法切换到虚拟环境的解决方法(两种方案)
查看>>
pycharm连接sqlite
查看>>
Pycharm那些隐藏的实用小技巧,yyds!
查看>>
PyCharm配置SSH和SFTP远程连接服务器
查看>>
Pycharm隐藏的实用小技巧!建议收藏
查看>>
PyChord 项目常见问题解决方案
查看>>
pydoc使用
查看>>
pyechart
查看>>
pyecharts中管理工具按钮以及修改图表主题
查看>>
pyechart值域区间
查看>>
pyest+appium实现APP自动化测试,思路全总结在这里
查看>>
Pygame
查看>>
Pygame 围绕轴旋转立方体
查看>>
Pygame 的详细介绍-ChatGPT4o作答
查看>>
Pygame 窗口几秒钟后没有响应
查看>>
Pygame.display.togling_fulcreen()不起作用
查看>>
Pygame中的倒数计时器
查看>>
Pygame介绍以及下载
查看>>
Pygame初始-模仿windows待机画面
查看>>
PYGAME在没有显示的情况下不返回操纵杆轴移动
查看>>