Python: Socket网络编程,多线程处理小Demo
生活随笔
收集整理的這篇文章主要介紹了
Python: Socket网络编程,多线程处理小Demo
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個簡單的例子,深入研究一下socket的多線程處理任務
?
Server端:
#!/usr/bin/env python #encoding:utf8 # # 注意:定義encoding時必須在第二行import socket import Queue import threading from time import sleephost = "127.0.0.1" port = 60283 timeWait = 3 #定義每個線程處理任務時需要的時間,模擬處理任務 ThreadNum = 10 #定義創建的線程 cache = Queue.Queue(maxsize=1000) #定義一個隊列# 處理任務的類 class Server(threading.Thread):def __init__(self, cache, ThreadName):threading.Thread.__init__(self)self.name = ThreadNameself.cache = cachedef run(self):while True:if not cache.empty(): #判斷隊列是否為空conn, addr = cache.get()data = conn.recv(1024)conn.sendall('success')print 'cacheData: ' + data + '; ThreadName: ' + self.name + '; cacheSize: ' + str(self.cache.qsize())sleep(timeWait)for i in range(ThreadNum):s = Server(cache, str(i))s.setDaemon(True) #設置為守護模式,當主線程退出時,子線程立即退出 s.start()# 創建Socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定socket s.bind((host, port)) # 設置系統最大等待隊列,當連接過多時,系統緩存中可以緩存多少連接,不宜設置過大,消耗內存和cpu s.listen(5)while True:# 循環接受,當接受到連接時,把連接放入隊列中,由線程獲取后執行conn, addr = s.accept()cache.put((conn, addr))conn.close()?
Client端:
#!/usr/bin/env python # import socket from time import sleep from threading import Threadhost = "127.0.0.1" port = 60283 num = 100def sirec(s, n):s.sendall('sn:' + str(i))data = s.recv(1024)s.close()for i in range(1, 100):s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))t = Thread(target=sirec, args=(s, 1))#t.setDaemon(True) t.start()print 'run over'?
關于隊列Queue的使用:
q.qsize() 返回隊列的大小 q.empty() 如果隊列為空,返回True,反之False q.full() 如果隊列滿了,返回True,反之False q.full 與 maxsize 大小對應 q.get([block[, timeout]]) 獲取隊列,timeout等待時間 q.get_nowait() 相當q.get(False) 非阻塞 q.put(item) 寫入隊列,timeout等待時間 q.put_nowait(item) 相當q.put(item, False) q.task_done() 在完成一項工作之后,q.task_done() 函數向任務已經完成的隊列發送一個信號 q.join() 實際上意味著等到隊列為空,再執行別的操作?
轉載于:https://www.cnblogs.com/djoker/p/8267547.html
總結
以上是生活随笔為你收集整理的Python: Socket网络编程,多线程处理小Demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决:EXCEL复制粘贴,精度丢失
- 下一篇: 一行代码搞定 FTP 服务