用資料池來實現socket併發

2022-03-14 02:10:16 字數 1580 閱讀 2464

最終目標:啟動服務後可以有無數個訪問,並且可以隨時輸入,服務端使用程序池。

服務端

from  socket import *

import

os,time

from concurrent.futures import

processpoolexecutor

deffunc(conn,addr):

while

true:

try:

ret = conn.recv(1024)

ifnot ret:break

time.sleep(5)

print(ret.decode('

utf-8'))

conn.send(ret.upper())

print("

埠號:【%s】是,程序id:【%s】

"% (addr[1],os.getpid()))

except

connectionreseterror:

break

if__name__ == "

__main__":

server =socket(af_inet, sock_stream)

server.setsockopt(sol_socket, so_reuseaddr, 1)

server.bind((

'127.0.0.1

', 8130))

server.listen(5)

p = processpoolexecutor(2)

while

true:

conn,addr =server.accept()

p.submit(func,conn,addr)

客戶端

from socket import *

while

true:

client =socket(af_inet, sock_stream) #這裡使用的是偽鏈結,每輸入一次都會斷開,但客戶端看起來一直與服務端保持著鏈結,其實沒有

data = input('

>>>

').strip()

client.connect((

'127.0.0.1

',8130))

client.send(data.encode(

'utf-8'))

ret = client.recv(1024)

print(ret.decode('

utf-8'))

client.close()

建立了4個客戶端,執行結果

hgsdfa

埠號:【54815】是,程序id:【15828】

eawd

埠號:【54817】是,程序id:【5580】

few埠號:【54819】是,程序id:【15828】

few埠號:【54820】是,程序id:【5580】

cv;埠號:【54829】是,程序id:【15828】

g埠號:【54831】是,程序id:【5580】

#可以清楚的看到,程序id只有兩個,證明確實是在程序池中迴圈

程序池版socket併發聊天

server pool內的程序數預設是cpu核數,假設為4 檢視方法os.cpu count 開啟6個客戶端,會發現2個客戶端處於等待狀態 在每個程序內檢視pid,會發現pid使用為4個,即多個客戶端公用4個程序 from socket import from multiprocessing imp...

用socket來傳送郵件

以前用vb時,記得有個mail控制項,後來接觸到了cdo.messages這個玩意,發郵件是蠻方便,那還是在vbs的情況下,後來看了下php,perl,發現發郵件乙個函式就可以了,呵呵,那麼這些背後的細節是什麼呢,還是用socket來揭示下吧 郵件傳送離不開一樣東西,smtp,即簡單郵件傳輸協議,對...

基於多執行緒來實現併發的socket套接字

server import socket from threading import thread def server conn while true try data conn.recv 1024 except exception continue if data b q print 關閉子執行...