协程虽然是轻量级的线程,但到达一定数量后,仍然会造成服务器崩溃出错。最好的方法通过限制协程并发数量来解决此类问题。

server代码:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Author : Cain
  4. # @Email : 771535427@qq.com
  5. # @Filename : gevnt_sockserver.py
  6. # @Last modified : 2017-11-24 16:31
  7. # @Description :
  8.  
  9. import sys
  10. import socket
  11. import time
  12. import gevent
  13. from gevent import socket,monkey,pool #导入pool
  14. monkey.patch_all()
  15.  
  16. def server(port, pool):
  17. s = socket.socket()
  18. s.bind(('0.0.0.0', port))
  19. s.listen()
  20. while True:
  21. cli, addr = s.accept()
  22. #print("Welcome %s to SocketServer" % str(addr[0]))
  23. pool.spawn(handle_request, cli) #通过pool.spawn()运行协程
  24.  
  25. def handle_request(conn):
  26. try:
  27. data = conn.recv(1024)
  28. print("recv:", data)
  29. data = 'From SockeServer:192.168.88.118---%s' % data.decode("utf8")
  30. conn.sendall(bytes(data, encoding="utf8"))
  31. if not data:
  32. conn.shutdown(socket.SHUT_WR)
  33. except Exception as ex:
  34. print(ex)
  35. finally:
  36. conn.close()
  37.  
  38. if __name__ == '__main__':
  39. pool = pool.Pool(5) #限制并发协程数量5
  40. server(8888, pool)

client(通过gevent模拟并发数量):

  1. import socket
  2. import gevent
  3. from gevent import socket, monkey
  4. from gevent.pool import Pool
  5. import time
  6.  
  7. monkey.patch_all()
  8.  
  9. HOST = '192.168.88.118'
  10. PORT = 8888
  11. def sockclient(i):
  12. #time.sleep(2)
  13. s = socket.socket()
  14. s.connect((HOST, PORT))
  15. #print(gevent.getcurrent())
  16. msg = bytes(("This is gevent: %s" % i),encoding="utf8")
  17. s.sendall(msg)
  18. data = s.recv(1024)
  19. print("Received", data.decode())
  20.  
  21. s.close()
  22.  
  23. pool = Pool(5)
  24. threads = [pool.spawn(sockclient, i) for i in range(2000)]
  25. gevent.joinall(threads)

由于服务器限制连接并发数量;所以客户端同时并发连接数超过服务器端并发数量,就会引发连接错误信息:

  1. Exception in thread Thread-849:
  2. Traceback (most recent call last):
  3. File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\threading.py", line 916, in _bootstrap_inner
  4. self.run()
  5. File "C:\Users\admin\AppData\Local\Programs\Python\Python36\lib\threading.py", line 864, in run
  6. self._target(*self._args, **self._kwargs)
  7. File "E:/chengd/python/python3/matp/die/geven_sockclient.py", line 26, in sockclient
  8. data = s.recv(1024)
  9. ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

python3通过gevent.pool限制协程并发数量的更多相关文章

  1. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  2. windows下多进程加协程并发模式

    好久没更新博客了.正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得.如标题所示,今天就来说说windows下多进程加协程并发模式.其实网上还是蛮多在linux下的多进程加协程并发 ...

  3. Gevent模块,协程应用

    Gevent官网文档地址:http://www.gevent.org/contents.html 进程.线程.协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩 ...

  4. 二、深入asyncio协程(任务对象,协程调用原理,协程并发)

      由于才开始写博客,之前都是写笔记自己看,所以可能会存在表述不清,过于啰嗦等各种各样的问题,有什么疑问或者批评欢迎在评论区留言. 如果你初次接触协程,请先阅读上一篇文章初识asyncio协程对asy ...

  5. Go语言协程并发---管道信号量应用

    package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...

  6. python3多进程 进程池 协程并发

    一.进程           我们电脑的应用程序,都是进程,进程是资源分配的单位.进程切换需要的资源最大,效率低.         进程之间相互独立         cpu密集的时候适合用多进程 #多 ...

  7. 协程并发框架gevent及其用法

    gevent是python的一个并发框架,采用协程实现并发目的,用起来也非常简单 gevent的docs:http://www.gevent.org/contents.html 一个最简单的例子: i ...

  8. python中的协程并发

    python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...

  9. python使用协程并发

    协程 协程是一种用户态的轻量级线程,又称微线程. 协程拥有自己的寄存器上下文和栈,调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此:协程能保留上一次调 ...

随机推荐

  1. MVP模式及性能优化

    1.base BaseActivity public abstract class BaseActivity<V,P extends BasePresenter<V>>exte ...

  2. (网页)javascript该如何学习?怎么样才能学好?

    文章摘抄自强哥文章   很多刚刚涉足软件开发的差不多都是只懂得HTMLCSS不懂得javascript,所以就想学习js,于是就从网上搜各种视频,或者买各种书籍回来看,很多时候都是浪费时间,因为根本看 ...

  3. Java:构造代码块,静态代码块

    本文内容: 局部代码块 构造代码块 静态代码块 补充 首发日期:2018-03-28 局部代码块: 局部代码块用于限制变量的生命周期,如果希望某些变量在某一过程之后直接失效而不希望被后面继续操作时,可 ...

  4. [20171101]修改oracle口令安全问题.txt

    [20171101]修改oracle口令安全问题.txt --//等保的问题,做一些关于修改oracle口令方面的测试. 1.oracle修改口令一般如下方式: alter user scott id ...

  5. python第六十八天--第十二周作业

    主题: 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下讲师视图 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条 ...

  6. 用Python实现数据结构之链表

    链表 链表与栈,队列不一样,它是由一个个节点构成的,每个节点存储着本身的一些信息,也存储着其他一个或多个节点的引用,可以从一个节点找到其他的节点,节点与节点之间就像是有链连在一起一样,这种数据结构就叫 ...

  7. Python+Pandas 读取Oracle数据库

    Python+Pandas 读取Oracle数据库 import pandas as pd from sqlalchemy import create_engine import cx_Oracle ...

  8. do-while语句及for语句(初学者)

    1.do-while语句的一般形式为: do 语句 while(表达式): 这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断这个表达式是否为真,如果为真则继续循环:如果为假,则中止 ...

  9. 17秋 软件工程 团队第五次作业 Alpha Scrum8

    17秋 软件工程 团队第五次作业 Alpha Scrum8 今日完成的任务 世强:部门人员管理界面设计编写: 港晨:设计主页面: 树民:web后端框架与前端对接: 伟航:app前端界面的美工: 陈翔: ...

  10. DataUtils对Connection的获取、释放和关闭的操作学习

    DataSourceUitls介绍 DataSourceUitls类位于org.springframework.jdbc.datasource包下,提供了很多的静态方法去从一个javax.sql.Da ...