進程池和線程池

線程池

預先建立好一個數量較爲優化的線程組,在須要的時候馬上可以使用,就造成了線程池。就像生產者消費者模型那樣,主線程就像生產者同樣,他會不斷地的向池中提交任務,而並不關心池的內部是如何執行的以及哪個子線程來執行任務。線程池中的線程就至關於消費者,他會不斷地接受任務並將任務分派給空閒的線程去執行。python

來看例子。服務器

import threading import queue import time class MyThreadPool: def __init__(self,maxSize): self.maxSize=maxSize self._pool=queue.Queue(maxSize) for _ in range(maxSize): self._pool.put(threading.Thread) def getThread(self): return self._pool.get() def addThread(self): self._pool.put(threading.Thread) def run(i,pool): print("執行任務",i) time.sleep(1) pool.addThread() if __name__ == '__main__': pool=MyThreadPool(5) for i in range(20): t=pool.getThread() obj=t(target=run,args=(i,pool)) obj.start() print("活動的子線程:",threading.active_count()-1)

以上代碼的性能並不優化,實際設計還須要考慮的更多。併發

python中自帶的池

線程池

from multiprocessing.pool import ThreadPool import time def task_one(): time.sleep(1) print("任務一完成!") def task_two(): time.sleep(1) print("任務二完成!") pool=ThreadPool(2) pool.apply_async(task_one) pool.apply_async(task_two) print("任務提交完成!") pool.close()#在join以前必須關閉,不容許再向池中提交任務
pool.join() print("任務完成!")

進程池

from multiprocessing import Pool import time def task_one(): time.sleep(1) print("任務一完成!") def task_two(): time.sleep(1) print("任務二完成!") if __name__ == '__main__': pool=Pool(2) pool.apply_async(task_one) pool.apply_async(task_two) print("任務提交完成!") pool.close() pool.join() print("任務完成!")

線程池實現併發服務器

from multiprocessing.pool import ThreadPool import socket server=socket.socket() server.bind(('0.0.0.0',9999)) server.listen() def worker(connection): while True: recv_data=connection.recv(1024) if recv_data: print("接收到數據:",recv_data) connection.send(recv_data) else: connection.close() break

if __name__ == '__main__': pool=ThreadPool(4) while True: conn,addr=server.accept() pool.apply_async(worker,args=(conn,))
import socket client=socket.socket() client.connect(('0.0.0.0',9999)) while True: data=input("請發送數據:") client.send(data.encode()) print("收到回送數據:",client.recv(1024).decode())

進程池+線程池實現併發服務器

from multiprocessing.pool import ThreadPool from multiprocessing import Pool import socket import os server=socket.socket() server.bind(('0.0.0.0',9999)) server.listen() def worker(connection): while True: recv_data=connection.recv(1024) if recv_data: print("接收到數據:",recv_data) connection.send(recv_data) else: connection.close() break
def worker_process(server): thread_pool=ThreadPool(os.cpu_count()*2)#分配2倍CPU的進程
    while True: coon,addr=server.accept() thread_pool.apply_async(worker,args=(coon,)) if __name__ == '__main__': n=os.cpu_count() process_pool=Pool(n) for i in range(n): process_pool.apply_async(worker_process,args=(server,)) process_pool.close() process_pool.join()
import socket client=socket.socket() client.connect(('0.0.0.0',9999)) while True: data=input("請發送數據:") client.send(data.encode()) print("接收到數據",client.recv(1024).decode())
相關文章
相關標籤/搜索