Windows下,要把启动程序写在if __name__ == '__main__':里面执行
1,进程间的数据不共享
import multiprocessing import threading data_list = [] def task(arg): data_list.append(arg) print(data_list) def run(): for i in range(10): p = multiprocessing.Process(target=task,args=(i,)) p.start() if __name__ == '__main__': run() 结果: [3] [2] [0] [6] [5] [4] [1] [7] [9] [8]
2,其他常用共能:
.join() :控制主进程等待子进程的时间
.setDaemon(True):主进程不再等,主进程结束则所有子进程终止
.setName() : 设置名字
getName() 获取当前进程的名字
multiprocessing.current_process() 获取当前进程
multiprocessing.current_process().ident/pid 获取当前进程的id
以上用法都跟线程的用法相似,可以对比记忆
3,进程间的数据共享
(1),multiprocessing.Queue
import multiprocessing import threading import queue import time q = multiprocessing.Queue() def task(arg,q): q.put(arg) if __name__ == '__main__': q = multiprocessing.Queue() for i in range(10): p = multiprocessing.Process(target=task,args=(i,q,)) p.start() while True: v = q.get() print(v)
import multiprocessing import threading import queue import time q = multiprocessing.Queue() def task(arg,q): q.put(arg) def run(): for i in range(10): p = multiprocessing.Process(target=task, args=(i, q,)) p.start() while True: v = q.get() print(v) run()
(2),Manager
import time import threading import multiprocessing def task(arg,dic): time.sleep(2) dic[arg] = 100 if __name__ == '__main__': m = multiprocessing.Manager() dic = m.dict() process_list = [] for i in range(10): p = multiprocessing.Process(target=task,args=(i,dic,)) p.start() process_list.append(p) while True: count = 0 for p in process_list: if not p.is_alive(): count += 1 if count == len(process_list): break print(dic)
import time import threading import multiprocessing m = multiprocessing.Manager() dic = m.dict() def task(arg): dic[arg] = 100 def run(): for i in range(10): p = multiprocessing.Process(target=task, args=(i,)) p.start() input('>>>') print(dic.values()) if __name__ == '__main__': run()
4,进程锁: 跟线程锁对照记忆
5,进程池
import time from concurrent.futures import ProcessPoolExecutor def task(arg): time.sleep(2) print(arg) if __name__ == '__main__': pool = ProcessPoolExecutor(5) for i in range(10): pool.submit(task,i)
浙公网安备 33010602011771号