进程池的基本概念
-
为什么有进程池的概念
- 效率问题
- 每次开启进程,都需要开启属于这个进程的内存空间
- 寄存器,堆栈
- 进程过多,操作系统的调度
-
进程池
- python中的 先创建一个属于进程的池子
- 这个池子指定能存放多少进程
- 先将这些进程创建好
-
更高级的进程池
- 3,20
- 默认启动3个进程
- 处理能力不够的时候,加进程
- 最多20个
- python中没有
from multiprocessing import Pool,Process
import time
#Process就无需使用了
def func(n):
for i in range(10):
print(n+1)
#下面这段比较进程池和多进程所需时间的不同
if __name__ == '__main__':
start = time.time()
pool = Pool(5) #启动5个进程
pool.map(func, range(100)) #range处必须是可迭代的参数,100个任务
t1 = time.time()-start
start = time.time()
p_lst = []
for i in range(100):
p = Process(target=func, args=(i, ))
p_lst.append(p)
p.start()
for p in p_lst: p.join()
t2 = time.time()-start
print(t1,t2)
async异步方式
from multiprocessing import Pool
import time
import os
def func(n):
print('start func%s'%n,os.getpid())
time.sleep(1)
print('end func%s'%n,os.getpid())
if __name__ == '__main__':
p = Pool()
for i in range(10):
p.apply_async(func,args=(i,)) #apply为同步执行任务, apply_async异步执行任务
p.close() #必须先要close
p.join() #感知进程池中的任务执行结束
利用异步方式创建Socket Server
# server.py
from multiprocessing import Pool
import socket
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()
#client.py
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
ret = sk.recv(1024).decode('utf-8')
print(ret)
msg = input('>>>').encode('utf-8')
sk.send(msg)
sk.close()