python學習筆記(59) 進程池
阿新 • • 發佈:2018-11-26
阻塞 執行 數加 常用 close call 回調 get() ==
p = Pool(5) # 一般cpu個數+1
p.map(funcname,iterable) # 默認異步在,自帶close和join,返回列表
p.apply() # 同步調用,不常用,有返回值
p.apply_async() # 異步調用,和主進程完全異步,需要手動close和join
##################################################
進程池和回調函數
from multiprocessing import Pool
import os
import time
# def func(n):
# print(n+1)
#
# if __name__ == ‘__main__‘:
# pool = Pool(5) # 一般cpu個數加1
# pool.map(func,range(100)) # 自帶join和close,默認異步
def func1(n):
print(‘in func1‘,os.getpid())
return n*n
def func2(nn):
print(‘in func2‘,os.getpid())
print(nn)
if __name__ == ‘__main__‘:
print(‘主進程‘,os.getpid())
p = Pool(5)
p.apply_async(func1,args=(10,),callback=func2) # apply 同步,不常用 回調函數在主進程執行
p.close() # 結束進程池接受任務
p.join() # 感知進程池中的任務執行結束
#########################################################
進程池的返回值
import time
from multiprocessing import Pool
def func(i):
time.sleep(1)
return i*i
if __name__ == ‘__main__‘:
p = Pool(5)
res_1 = []
for i in range(10):
res = p.apply_async(func,args=(i,)) # apply不用get
res_1.append(res)
# print(res.get()) # 會在此處阻塞導致同步
for res in res_1:
print(res.get())
ret = p.map(func,range(10)) # 一次性返回所有值
print(ret)
##################################################
進程池實現TCP-Sever
import socket
from multiprocessing import Pool
def func(conn):
conn.send(b‘hello‘)
print(conn.recv(1024).decode(‘utf-8‘))
conn.close()
if __name__ == ‘__main__‘:
p = Pool(5)
sk = socket.socket()
sk.bind((‘127.0.0.1‘,8080))
sk.listen()
while True:
conn,addr = sk.accept()
p.apply_async(func,args=(conn,))
sk.close()
python學習筆記(59) 進程池