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

猜你喜欢

转载自www.cnblogs.com/farion/p/10017516.html