python多进程multiprocessing使用,看这篇就够了(一)

本文介绍Python多进程编程的基础概念及应用技巧,包括进程ID查看、守护进程设置、进程间通信等,并通过具体示例展示了如何利用多进程提高计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 看代码

 

 以上可看到,2个任务(子进程)同时启动,下载时间由耗时最久的任务决定。

再看看没有使用多进程的情况,下载时间是2个任务下载时间之和。

down_time变量的备注写错了,应该是2-5秒。

2.在电脑里,每个进程都是独立的,都有自己的资源、内存空间,当然都有唯一的id,打开电脑的任务管理器,可以看到,这里显示电脑正在运行的所有进程。 进程是正在运行的程序的实例。

3.多进程是怎么运行的呢,python的os包提供了getpid()方法可以打印进程id, 

4. 如果不使用join(join起到阻塞作用), 看看是什么情况: 

 5.以上可以看出join的作用了,使用join,主进程跑到join那里,处于挂起状态,看源码,join可以通过设置timeout来决定主进程等待多长时间,若子进程在timeout用完了还没跑完,主进程会杀死子进程。

6. 这里引出守护进程daemon, 将子进程用daemon设置为True, 则子进程成为主进程的守护线程,主进程死,则守护线程死。

7. 各个进程是独立的,不会共享全局变量,那么进程间如何进行进行通信呢,可以使用multiprocessing的Queue,

例如,要计算从0到1亿的和,如果不使用多进程,时间将会很长,如果使用多进程,将0到1亿分成几段,每一段使用一个进程进行计算,最后将各个进程的计算的结果相加,就能大大减少计算的时间。

from multiprocessing import Process, Queue
import time


def add(num_list, que):
    total = 0
    for i in num_list:
        total += i

    que.put(total)


def main():
    processes = []
    num_list = []
    index = 0
    for i in range(1, 11):
        # 将1到1亿的数字分成10个列表, 每个列表包含1千万个数字, num_list结构
        # [[1, 2, 3,..., 10000000], [10000001, 10000002,..., 20000000], ..., [90000001, 90000002,..., 100000000]]
        num_list.append([n for n in range(index, index+10000001)])
        index += 10000001

    que = Queue()
    for j in range(10):
        p = Process(target=add, args=(num_list[j], que))
        processes.append(p)

    start_time = time.time()
    for p in processes:
        p.start()

    for p in processes:
        p.join()

    total = 0
    while not que.empty():
        total += que.get()

    end_time = time.time()
    print(f"Total time taken: {end_time - start_time}, total: {total}")  
    # Total time taken: 8.356080055236816, total: 5000000950000045


if __name__ == '__main__':
    main()

 ps: 线上项目千万不要这样用列表装大量数据,服务器内存会爆炸!!!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值