• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python3通过gevent.pool限制协程并发数量的实现方法

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

    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] 远程主机强迫关闭了一个现有的连接。

    到此这篇关于python3通过gevent.pool限制协程并发数量的文章就介绍到这了,更多相关python3协程并发数量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python gevent协程切换实现详解
    • python 协程 gevent原理与用法分析
    • Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
    • 简单了解python gevent 协程使用及作用
    • 详解python之协程gevent模块
    上一篇:python 的生产者和消费者模式
    下一篇:Python实现贪吃蛇小游戏(双人模式)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python3通过gevent.pool限制协程并发数量的实现方法 python3,通过,gevent.pool,限制,