python3 程序池版的socket併發聊天

2022-09-07 02:24:15 字數 1943 閱讀 7307

pool內的程序數預設是cpu核數,假設為4(檢視方法os.cpu_count())

開啟6個客戶端,會發現2個客戶端處於等待狀態

在每個程序內檢視pid,會發現pid使用為4個,即多個客戶端公用4個程序

tcp_server.py

#

-*- coding: utf-8 -*-

import

osfrom socket import *

from multiprocessing import

pool

deftalk(conn):

while 1: #

迴圈通訊

try:

from_client_msg = conn.recv(1024)

ifnot from_client_msg:break

print("

程序(%s)來自客戶端的訊息:%s

" %(os.getpid(), from_client_msg))

conn.send(from_client_msg.upper())

except

:

break

conn.close()

if__name__ == '

__main__':

server =socket()

ip_port = ("

127.0.0.1

", 8001)

server.bind(ip_port)

server.listen(5)

pool = pool(4) # 建立程序池,程序池內,最多可執行4個程序

while 1: #

迴圈連線

conn, addr =server.accept()

pool.close() # 程序池不再接收新任務

pool.join() # 程序池內的程序都執行完了

server.close()

#程序(5536)來自客戶端的訊息:b'aa'

#程序(4440)來自客戶端的訊息:b'bb'

#程序(3268)來自客戶端的訊息:b'cc'

#程序(4876)來自客戶端的訊息:b'dd'

#程序(5536)來自客戶端的訊息:b'ee'

#程序(4440)來自客戶端的訊息:b'ff'

tcp_client.py

#

-*- coding: utf-8 -*-

from socket import *client =socket()

ip_port = ("

127.0.0.1

", 8001)

client.connect(ip_port)

while 1: #

迴圈通訊

inp = input("

>>:

").strip()

ifnot inp: continue

if inp.upper() == "

q": break

client.send(inp.encode())

from_server_msg = client.recv(1024)

print("

來自服務端的訊息:

", from_server_msg)

client.close()

#>>:cc

#來自服務端的訊息: b'cc'

#>>:

發現:併發開啟多個客戶端,服務端同一時間只有4個不同的pid,只能結束乙個客戶端,另外乙個客戶端才會進來.

python3 程序池Pool 詳解

當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool時,可以指定乙個最大程序數,當有新的請求提交到pool中...

python3 程序池的同步呼叫

coding utf 8 import osimport time from multiprocessing import pool deffunc n print s s os.getpid n return n 2 deffunc2 n print s s os.getpid n time.sl...

Python3 執行緒池問題

執行緒池 一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務。這避免了在處理短時間任務時建立與銷毀執行緒的代價。執行緒池不僅能夠保證核心的充分利用,還能防止過分排程。可用執行緒數量應該取決於可用的併發處理器 ...