Python並發編程-進程池及異步方式


進程池的基本概念

  • 為什么有進程池的概念

    • 效率問題
    • 每次開啟進程,都需要開啟屬於這個進程的內存空間
    • 寄存器,堆棧
    • 進程過多,操作系統的調度
  • 進程池

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM