亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Python網(wǎng)絡(luò)編程之通過ThreadingMixIn實(shí)現(xiàn)多線程異步套接字程序

オリジナル 2016-11-07 11:15:07 659
サマリー:使用ThreadingMixIn類的特點(diǎn): 在線程間共享應(yīng)用的狀態(tài),與使用ForkingMixIn類相比避免進(jìn)程間通信的復(fù)雜操作。代碼如下:#! /usr/bin/python    import os  import socket  import threading  import SocketS

使用ThreadingMixIn類的特點(diǎn): 在線程間共享應(yīng)用的狀態(tài),與使用ForkingMixIn類相比避免進(jìn)程間通信的復(fù)雜操作。

代碼如下:

#! /usr/bin/python
 
 import os
 import socket
 import threading
 import SocketServer
 
 SERVER_HOST = 'localhost'
 SERVER_PORT = 0
 BUF_SIZE = 1024
 
 def client(ip, port, message):
     """A client to test threading mixin server"""
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sock.connect((ip, port))
     try:
         sock.sendall(message)
         response = sock.recv(BUF_SIZE)
         print "Client received: %s" % response
     finally:
         sock.close()
 class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
     """An example of threaded TCP request handler """
     def handle(self):
         data = self.request.recv(1024)
         current_thread = threading.current_thread()
         response = "%s: %s" % (current_thread.name, data)
         self.request.sendall(response)
 
 class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
     """Nothing add here, inherited everything from parenets"""
     pass
 
 if __name__ == '__main__':
     #run server
     server = ThreadedTCPServer((SERVER_HOST, SERVER_PORT), ThreadedTCPRequestHandler)
     ip, port = server.server_address
     
     # start a thread with the server, one thread per request
     server_thread = threading.Thread(target=server.serve_forever)
     # Exit the server thread when the main thread exits
     server_thread.daemon = True
     server_thread.start()
     print "Server loop running on thread: %s" % server_thread.name
 
     # run clients
     client(ip, port, "Hello from client1")
     client(ip, port, "Hello from client2")
     client(ip, port, "Hello from client3")
 
     #server cleanup
     server.shutdown()


注意1:在寫ThreadedTCPRequestHandler類中的方法handle的時(shí)候?qū)andle寫為了handler,結(jié)果在執(zhí)行程序后,顯示服務(wù)器返回給客戶端的信息為空,原因是handle方法是ThreadedTCPRequestHandler類所繼承的BaseRequestHandler類的類方法,由于BaseRequestHandler類的handle方法默認(rèn)行為是啥也不做,所以要覆寫handle方法來處理接受客戶端消息,處理客戶端請求,如果寫為handler則在程序中默認(rèn)調(diào)用了父類BaseRequestHandler的handle方法,但是啥也沒做,所以顯示服務(wù)器返回信息為空。

RequestHandler.handle()

This function must do all the work required to service a request. The default implementation does nothing. Several instance attributes are available to it; the request is available as self.request; the client address as self.client_address; and the server instance as self.server, in case it needs access to per-server information.

The type of self.request is different for datagram or stream services. For stream services, self.request is a socket object; for datagram services, self.request is a pair of string and socket. However, this can be hidden by using the request handler subclasses StreamRequestHandler or DatagramRequestHandler, which override the setup() and finish() methods, and provide self.rfile and self.wfile attributes. self.rfile and self.wfile can be read or written, respectively, to get the request data or return data to the client.

注意2,關(guān)于線程對象的setDaemon屬性,為True表示服務(wù)器線程為后臺(tái)線程,當(dāng)沒有活動(dòng)連接到后臺(tái)線程時(shí),程序執(zhí)行完畢自動(dòng)退出,當(dāng)沒有活動(dòng)的非后臺(tái)線程活動(dòng)時(shí),執(zhí)行完畢程序才會(huì)自動(dòng)退出。對于本代碼,具體表現(xiàn)是如果在setDaemon為True的狀態(tài),不執(zhí)行服務(wù)器套接字的shutdown(),程序執(zhí)行完一樣會(huì)自動(dòng)退出,而setDaemon為False的狀態(tài), 則一定要執(zhí)行shutdown(),程序才會(huì)自動(dòng)終止。


手記を発表する

人気のある見出し語