python3通过gevent.pool限制协程并发数量
2017-11-27 13:58
507 查看
协程虽然是轻量级的线程,但到达一定数量后,仍然会造成服务器崩溃出错。最好的方法通过限制协程并发数量来解决此类问题。
server代码:
#!/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)
client(通过gevent模拟并发数量):
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)
由于服务器限制连接并发数量;所以客户端同时并发连接数超过服务器端并发数量,就会引发连接错误信息:
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] 远程主机强迫关闭了一个现有的连接。
相关文章推荐
- Python 通过gevent实现协程
- Python并发编程协程(Coroutine)之Gevent
- Python并发编程协程(Coroutine)之Gevent
- python+gevent+threadpool+cx_Oracle高并发时空指针问题
- Python并发实践_02_通过yield实现协程
- python基础-协程gevent用法、协程同步异步、协程socket并发例子
- python里创建多个协程并发执行
- python学习笔记:多并发(线程、进程、协程)
- Python 协程并发爬虫网页
- python中的协程模块gevent
- GO笔记:解决爬虫限制http并发数量的问题
- python协程io自动切换--gevent
- [python协程gevent]之greenlet初识
- Node.js Promise.all 限制并发数量
- Python多进程并发操作中进程池Pool的应用
- 高并发系统限流中的漏桶算法和令牌桶算法,通过流量整形和速率限制提升稳定性
- python并发之协程
- Python通过future处理并发
- 通过线程池使用多线程并发:ThreadPoolTaskExecutor 的应用例子
- 备忘:Ngnix配置下载目录并限制并发数量与下载带宽的方法