博客
关于我
Python multiprocessing使用详解
阅读量:800 次
发布时间: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/

你可能感兴趣的文章
PyInstaller 构建的 Windows EXE 因多处理而失败
查看>>
Pyinstaller--Windowed或--noconsole.exe不允许打开chromedriver
查看>>
Pyinstaller依赖项的许可证
查看>>
PyInstaller可执行文件找不到包含的flASK-COMPRESS
查看>>
Pyinstaller:‘;Fiona‘;没有属性‘;_loading‘;(很可能是由于循环导入)
查看>>
pyinstaller:更改应用程序图标
查看>>
Pylint“未解决的导入“;Visual Studio 代码中的错误
查看>>
pyLoad远程代码执行漏洞复现(CVE-2023-0297)
查看>>
pymongo update_one(),upsert=True,不使用$运算符
查看>>
pymongo 中的快速或批量更新
查看>>
PyQ5学习笔记——使用内部槽函数关闭窗口
查看>>
PyQ5学习笔记——使用自定义槽函数关闭窗口
查看>>
PyQt MimeData 文件名
查看>>
PyQt QString转成python stirng
查看>>
PyQt QToolButton在焦点时不更新图标
查看>>
PyQt 正确使用 emit() 和 pyqtSignal()
查看>>
PyQT-将文件复制到剪贴板
查看>>
PyQt5 按钮运行功能和更新 LCD
查看>>
PyQt5:如何安装/运行 Qt 设计器
查看>>
PyQt5——pyqtgraph绘图大招
查看>>