Python中为什么服务端设置gevent.pool.Pool()池的数量不起作用?

–server 端
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:—%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(2) #限制并发协程数量 5
server(8888, pool)

–client 端
import socket
import gevent
from gevent import socket, monkey
from gevent.pool import Pool
import time

monkey.patch_all()

HOST = '192.168.2.202’
PORT = 8888
def sockclient(i):
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(50)
threads = [pool.spawn(sockclient, i) for i in range(2000)]
gevent.joinall(threads)

按道理说我在服务端设置协程池的数量为 2, 而客户端一次性向服务端发 50 个,服务端应该报错才对, 可是服务端并没有报错, 而且即使我开 3 个客户端同时连接服务端程序依然运行正常, 这是怎么原因? 服务端的 pool.Pool(2)完全没有作用呀.
Python中为什么服务端设置gevent.pool.Pool()池的数量不起作用?


2 回复

我遇到过类似的问题。通常是因为在gevent中,pool的大小控制的是并发greenlet的数量,而不是worker进程或线程数。如果你在WSGI服务器(如gunicorn)里用gevent worker,池的大小可能被其他配置覆盖了。

关键点在于:gevent的Pool是用于限制并发协程数量的,但如果你用gunicorn -k gevent --worker-connections 100,这个worker-connections参数实际上会覆盖你代码中设置的pool大小。因为gunicorn的gevent worker会创建自己的hub和pool。

看看这个例子:

from gevent import pool, monkey
monkey.patch_all()
import gevent

# 这个pool大小可能被上层服务器配置覆盖
my_pool = pool.Pool(10)

def task(n):
    gevent.sleep(1)
    print(f"Task {n} done")

# 提交任务到pool
jobs = [my_pool.spawn(task, i) for i in range(50)]
gevent.joinall(jobs)

如果这段代码运行在gunicorn的gevent worker下,实际并发数可能由--worker-connections决定,而不是代码里的10。

检查你的部署方式,如果是用WSGI服务器,看看服务器配置是否覆盖了pool大小。


哪位大佬帮忙看看是怎么回事? 我不信没人懂.

回到顶部