python自带池
进程池和线程池创建用的是同一个模块(multiprocessing),但方法不同,进程池的方法是Pool,线程池的方法是pool.ThreadPool。不管是进程池还是线程池,它们都是默认开启守护模式的。下面以进程池为例:
实例化:pool = Pool(num),num是开启进程的数量。
提交任务:pool.apply_async(func[,args = (),kwds = {}])
关闭:pool.close(),关闭后就禁止再提交任务。
join等待:pool.join(),只要队列计数器不为0,就一直阻塞。
中止进程:pool.terminate():中止进程池,中止所有任务。
multiprocessing.cpu_count()可以返回cpu数
任务函数的返回值怎么获取?
通过变量接收:async_esult = pool.apply_async(func) ,再用get方法获取返回值:result = async_esult.get()。这个方法get会阻塞,又返回结果就解阻塞。
下面是利用线程池来实现简单的操作
from multiprocessing.pool import ThreadPool
if __name__ == '__main__':
def func1(*args,**kwargs)
print("这是任务一")
return "hello"
def func2(*args,**kwargs):
print("这是任务二")
p = ThreadPool(2)
a = p.apply_async(func1) #获取任务返回值
print(a.get())
p.apply_async(func2)
a = p.apply_async(func1) #获取任务返回值
print(a.get())
p.apply_async(func2)
p.close()
p.join()
这是任务一
hello
这是任务二
这是任务一
hello
这是任务二
使用池来实现并发服务器
from multiprocessing.pool import ThreadPool
import socket
if __name__ == '__main__':
server = socket.socket()
server.bind(('127.0.0.5',8899))
server.listen(20)
p = ThreadPool(20)
def recv(coon,addr):
while True:
data = coon.recv(1024)
if data:
print("收到来自{}的信息:{}".format(addr,data.decode()))
coon.send("已收到信息:%s"%data)
else:
coon.close()
break
while True:
coon,addr = server.accept() #有一个连接过来就交给一个线程去执行
p.apply_async(recv,args=(coon,addr))
网友评论