1. 程式人生 > >python學習筆記(59) 程序池

python學習筆記(59) 程序池

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()