進程池的基本概念
-
為什么有進程池的概念
- 效率問題
- 每次開啟進程,都需要開啟屬於這個進程的內存空間
- 寄存器,堆棧
- 進程過多,操作系統的調度
-
進程池
- 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()