標籤:random ret ble iter target append 機制 async from
1,進程可以無限開嗎?
進程不可以無限開,cpu有十六核,代表可以同時處理16個任務,如果有160個進程,每個進程
處理需要0.01s,16核的處理器處理160個進程就需要0.5s,因為進程越多需要的時間越多。
2,進程池
import osimport timeimport randomfrom multiprocessing import Poolfrom multiprocessing import Processdef func(i): i += 1if __name__ == ‘__main__‘: p = Pool(5) # 建立了5個進程。一般來說,這裡的數值是核心數#+1,如果不知道cpu的核心數是多少,可以調用os.cpu_count()查看 start = time.time() p.map(func,range(1000)) # target = func args=next(iterable) # [(1,2,3),1,2,3,4] p.close() # 是不允許再向進程池中新增工作 p.join() print(time.time() - start) start = time.time() l = [] for i in range(1000): p = Process(target=func,args=(i,)) # 建立了一百個進程 p.start() l.append(p) [i.join() for i in l] print(time.time() - start)
3,
import timefrom multiprocessing import Pool# applydef func(i): time.sleep(1) i += 1 # print(i) return i+1if __name__ == ‘__main__‘: p = Pool(5) res_l = [] for i in range(20): # p.apply(func,args=(i,)) # apply是同步提交任務的機制 res = p.apply_async(func,args=(i,)) # apply_async是非同步提交任務的機制 res_l.append(res) # print(res.get()) # 阻塞 :等待著任務結果 p.close() # close必須加在join,不允許再添加新的任務了 p.join() # 等待子進程結束再往下執行 [print(i.get()) for i in res_l]
python:進程池