python多进程模块multiprocessing

基础用法

multiprocessing创建的子进程拿不到返回值,可以通过进程间通信,从Queue里面取
如果需要返回值,用from concurrent.futures import ProcessPoolExecutor

由于GIL锁的存在,python CPU密集型计算并不能充分利用cpu性能,如果需要提高性能,可以考虑用lupa模块,执行lua代码来提高效率,居测试,性能可以提高30倍以上,懂c的可以用ctypes 模块执行c程序提高性能

from multiprocessing import Process
import os

# 子进程要执行的代码
def run_proc(name):
    print(name)

if __name__=='__main__':
    p = Process(target=run_proc, args=('test',))  #创建一个进程
    p1 = Process(target=run_proc, args=('test1',))
    p.start()  #执行进程
    p1.start()
    p.join()  #join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步
    p1.join()

进程池

如果要启动大量的子进程,可以用进程池的方式批量创建子进程:

from multiprocessing import Pool
import os, time, random

def long_time_task(name):
    start = time.time()
    time.sleep(1)
    end = time.time()

if __name__=='__main__':
    p = Pool(4)  # 进程数,默认大小是CPU的核数
    for i in range(8):  #添加进程后立即执行
        p.apply_async(long_time_task, args=(i,))  #非阻塞,4条进程同时执行
        # p.apply(long_time_task, args=(i,))  #阻塞,4个进程一条一条执行

    p.close()
    p.join()

进程间通信

from multiprocessing import Process, Queue
import os, time, random

# 写数据进程执行的代码:
def write(q):
    for value in ['A', 'B', 'C']:
        q.put(value)

# 读数据进程执行的代码:
def read(q):
    while True:
        value = q.get(True)

if __name__=='__main__':
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()
    
    # 启动子进程pr,读取:
    pr.start()
    # 等待pw结束:
    pw.join()
    
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    pr.terminate()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值