python的多线程不适合CPU密集型的任务,适合IO【文件读写,网络数据】密集型的任务
1.多进程
import multiprocessing import time def run(name): time.sleep(2) print('name', name) if __name__ == '__main__': p = multiprocessing.Process(target=run, args=('bob', )) p.start()
获取进程ID:
os.getppid() --父进程
os.getpid() ---当前进程的id
进程间通信
利用中间件queue.Queue,可以实现线程间通信:
q = queue.Queue()
q.put(value)
q.get()
利用中间件Queue实现进程通信:
from multiprocessing import Process, Queue def f(q): q.put([42, None, 'hello']) if __name__ == '__main__': q = Queue() p = Process(target=f, args=(q,)) p.start() print(q.get()) # prints "[42, None, 'hello']" p.join() #等待进程结束
使用pipes实现进程通信:
child_conn发送一次,parent_conn只能接受一次
from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, 'hello']) #发送端口 conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() # 管道的两头 p = Process(target=f, args=(child_conn,)) p.start() print(parent_conn.recv()) # prints "[42, None, 'hello']" 接受端 p.join()
使用manager实现线程间数据共享
from multiprocessing import Process, Manager def f(d, l): d[1] = '1' d['2'] = 2 d[0.25] = None l.append(1) print(l) 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)