赞
踩
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: 线上项目千万不要这样用列表装大量数据,服务器内存会爆炸!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。