協程雖然是輕量級的線程,但到達必定數量後,仍然會形成服務器崩潰出錯。最好的方法經過限制協程併發數量來解決此類問題。python
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : Cain # @Email : 771535427@qq.com # @Filename : gevnt_sockserver.py # @Last modified : 2017-11-24 16:31 # @Description : import sys import socket import time import gevent from gevent import socket,monkey,pool #導入pool monkey.patch_all() def server(port, pool): s = socket.socket() s.bind(('0.0.0.0', port)) s.listen() while True: cli, addr = s.accept() #print("Welcome %s to SocketServer" % str(addr[0])) pool.spawn(handle_request, cli) #經過pool.spawn()運行協程 def handle_request(conn): try: data = conn.recv(1024) print("recv:", data) data = 'From SockeServer:192.168.88.118---%s' % data.decode("utf8") conn.sendall(bytes(data, encoding="utf8")) if not data: conn.shutdown(socket.SHUT_WR) except Exception as ex: print(ex) finally: conn.close() if __name__ == '__main__': pool = pool.Pool(5) #限制併發協程數量5 server(8888, pool)
import socket import gevent from gevent import socket, monkey from gevent.pool import Pool import time monkey.patch_all() HOST = '192.168.88.118' PORT = 8888 def sockclient(i): #time.sleep(2) s = socket.socket() s.connect((HOST, PORT)) #print(gevent.getcurrent()) msg = bytes(("This is gevent: %s" % i),encoding="utf8") s.sendall(msg) data = s.recv(1024) print("Received", data.decode()) s.close() pool = Pool(5) threads = [pool.spawn(sockclient, i) for i in range(2000)] gevent.joinall(threads)
因爲服務器限制鏈接併發數量;因此客戶端同時併發鏈接數超過服務器端併發數量,就會引起鏈接錯誤信息:bootstrap
Exception in thread Thread-849: Traceback (most recent call last): File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\threading.py", line 916, in _bootstrap_inner self.run() File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\threading.py", line 864, in run self._target(*self._args, **self._kwargs) File "E:/chengd/python/python3/matp/die/geven_sockclient.py", line 26, in sockclient data = s.recv(1024) ConnectionResetError: [WinError 10054] 遠程主機強迫關閉了一個現有的鏈接。