创建多个进程
import multiprocessing from multiprocessing import Process, Lock import logging import os logger = multiprocessing.log_to_stderr() #打印日志 logger.setLevel(multiprocessing.SUBWARNING) thread_count = 5 def worker(lock,i): lock.acquire() print str(i)+aaa print('module name:', __name__) if hasattr(os, 'getppid'): # only available on Unix print('parent process:', os.getppid()) print('process id:', os.getpid()) logger.warning('doomed') lock.release() if __name__ == '__main__': lock = Lock() for i in range(thread_count): Process(target=worker, args=(lock,i,)).start()
multiprocessing 提供 Queue 与 Pipe两种方式传输数据
#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() #Pipe 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()
共享内存传递数据结果,Value和Array都是线程安全
from multiprocessing import Process, Value, Array def f(n, a): n.value = 3.1415927 for i in range(len(a)): a[i] = -a[i] if __name__ == '__main__': num = Value('d', 0.0) arr = Array('i', range(10)) print(num.value) # 0.0 print(arr[:]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] p = Process(target=f, args=(num, arr)) p.start() p.join() print(num.value) # 3.1415927 print(arr[:]) # [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
进程池
import multiprocessing import time def do_calculation(data): print(multiprocessing.current_process().name + " " + str(data)) time.sleep(3) return data * 2 def start_process(): print ('Starting', multiprocessing.current_process().name) if __name__ == '__main__': inputs = list(range(10)) print ('Input :' + str(inputs)) pool_size = multiprocessing.cpu_count() pool = multiprocessing.Pool(processes=pool_size, initializer=start_process, ) pool_outputs = pool.map(do_calculation, inputs) pool.close() # no more tasks pool.join() # wrap up current tasks print ('Pool :' + str(pool_outputs))
输出如下
root:~ # python f.py Input :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ('Starting', 'PoolWorker-1') PoolWorker-1 0 ('Starting', 'PoolWorker-2') PoolWorker-2 2 PoolWorker-1 1 PoolWorker-2 3 PoolWorker-1 4 PoolWorker-2 6 PoolWorker-1 5 PoolWorker-2 7 PoolWorker-1 8 PoolWorker-1 9 Pool :[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]