什么是进程?
cpu分配资源的最小单元,一个进程可以有多个线程,进程间数据默认是不共享的,进程也是有GIL锁
进程的编写
# 方式一 import multiprocessing lst = [] def func(arg): lst.append(arg) print(lst) if __name__ == '__main__': #这句只有在windos系统中需要写,而在linux和mac中是不需要的 for i in range(10): t = multiprocessing.Process(target=func,args=(i,)) t.start()
# 方式二 class MyProcess(multiprocessing.Process): def run(self): print('当前进程',multiprocessing.current_process()) def run(): p1 = MyProcess() p1.start() if __name__ == '__main__': run()
共享数据
虽然进程之间本质数据是不共享的,但也可以通过一些方法也能获取到不同进程的数据
multiprocessing.Queue
import multiprocessing 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) if __name__ == "__main__": run()
Manager
import time import multiprocessing def task(arg): time.sleep(2) print(arg) if __name__ == '__main__': m = multiprocessing.Manager() process_list = [] for i in range(10): p = multiprocessing.Process(target=task, args=(i,)) 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
连接其他电脑数据共享
import multiprocessing def task(arg): pass if __name__ == '__main__': while True: # 连接上指定的服务器 # 去机器上获取url url = 'adfasdf' p = multiprocessing.Process(target=task, args=(url,)) p.start()
进程锁
详见线程锁:https://www.cnblogs.com/--kai/p/9629264.html
进程池
import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def task(arg): time.sleep(2) print(arg) if __name__ == '__main__': pool = ProcessPoolExecutor(5) for i in range(10): pool.submit(task,i)