进程
以一个整体的形式暴露给操作系统管理, 里面包含对各种资源的调用, 是资源的集合
两个进程不能使用一块内存
两个进程想要交互需要有一个中间代理
创建新进程需要对其父进程进行一次克隆
进程智能操作子进程
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # -*- Author:Hinimix -*- import multiprocessing import threading def hnm_threa(): print(threading.get_ident()) def hnm_proce(name): print("from multiprocess %s" % name) t = threading.Thread(target=hnm_threa) t.start() for tmp in range(10): p = multiprocessing.Process(target=hnm_proce, args=(tmp,)) p.start()
进程Queue
# import multiprocessing import threading from multiprocessing import Process, Queue #进程Queue def hnm_proce(qq): qq.put([1, None, "hello"]) q = Queue() for tmp in range(10): p = Process(target=hnm_proce, args=(q,)) p.start() print(q.qsize())
进程Pipe
from multiprocessing import Process, Pipe import time def hnm_proce(conn): conn.send([111, None, "from child 1"]) conn.send([111, None, "from child 2"]) time.sleep(.1) print("from parent") print(conn.recv()) conn.close() parent_conn, child_conn = Pipe() if __name__ == '__main__': p = Process(target=hnm_proce, args=(child_conn,)) p.start() print(parent_conn.recv()) print(parent_conn.recv()) parent_conn.send("from daddy") p.join()
进程Manager
from multiprocessing import Process, Manager import os def f(d, l): d[os.getpid()] = os.getpid() l.append(os.getpid()) if __name__ == '__main__': with Manager() as manager: d = manager.dict() #生成字典,可在多个进程间共享传递 l = manager.list(range(5)) #生成列表,可在多个进程间共享 p_list = [] for i in range(10): p = Process(target=f, args=(d,l)) p.start() p_list.append(p) for res in p_list: res.join() print(d) print(l)
进程锁
from multiprocessing import Process, Lock def func(lock, num): # 进程锁保证输出完整 lock.acquire() try: print("hello %s" % num) finally: lock.release() if __name__ == '__main__': lock = Lock() for num in range(10): Process(target=func, args=(lock, num)).start()
进程池
#!/usr/bin/env python3 # -*- coding:utf-8 -*- # -*- Author:Hinimix -*- # import multiprocessing import threading from multiprocessing import Process, Pool import time import os def Foo(i): print("in progress", os.getpid()) time.sleep(1) return i+100 def Bar(arg): print("exec done", arg, os.getpid()) pool = Pool(processes=5) for i in range(10): # pool.apply(func=Foo, args=(i,)) #串行同步 # pool.apply_async(func=Foo, args=(i,)) #并行异步 pool.apply_async(func=Foo, args=(i,), callback=Bar) #回调函数 print("main pid ", os.getpid()) print("end") pool.close() pool.join() #如果注释,程序就直接关闭了