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

你可能感兴趣的文章
Python WebSocket自动化测试:构建高效接口测试框架
查看>>
Python Web开发
查看>>
Redis 配置文件杂项。
查看>>
Python web自动化测试 —— 文件上传
查看>>
Python web自动化测试 —— 文件上传!
查看>>
Python Web自动化测试开发环境搭建(附安装包与虚拟机环境)
查看>>
python win32api键盘_Python win32api.keybd_event模拟键盘输入
查看>>
python Windows显示当前鼠标坐标
查看>>
python Workbook 表格宽度
查看>>
python write报错a byte-like object is required.not str
查看>>
PYTHON调用大模型实现图片生成
查看>>
python yaml.dump 缩进错误
查看>>
Python yield generator
查看>>
Python yield 使用浅析
查看>>
Python yield解析:深入理解生成器的魔力
查看>>
Python You are using pip version 10.0.1, however version 19.3.1 is available.
查看>>
python zipfile模块学习笔记(一)
查看>>
Python zip函数 详解(全)
查看>>
Python \r\n与\n的转换
查看>>
python __new__中单例的作用
查看>>