我正在一个非常重负载的环境中工作,
我有一个Python代码,它在大约有100个CPU的服务器上启动一个包含300个进程的进程池,并不断运行进程来检查Redis的值,如果该值不存在,它会保存它,如果存在,它会保存它。运行一些繁重的计算。它使用 Redis
get set
命令来执行此操作。
每个进程都有一个 Redis 客户端,仅初始化一次,然后通过程序使用
伪代码
import redis
from concurrent.futures import ProcessPoolExecutor
redis: redis.Redis
def init_process():
global redis
redis = redis.Redis(host="127.0.0.1", port=6379, decode_response=True)
def recieved_request(unique_id):
x = redis.getset(unique_id, "hello world")
if x is not None:
heavy_cpu_load()
redis.delete(unique_id)
else:
redis.expire(unique_id, 60)
pool = ProcessPoolExecutor(max_workers=300, initializer=init_process)
def on_new_request():
pool.submit(recieved_request)
当以低流量运行代码时,它会按预期工作,但是当以高流量运行时,我会收到以下错误:
error 99 - connecting to cannot assign requested address
error while reading from 127.0.0.1:6379: (104, connection is reset by peer)
connection is closed by server
我尝试过修改超时以快速关闭空闲连接,并将
maxconnection
的数量更改为 50000,两者都不会导致行为发生变化。
我也面临着类似的情况;请告诉我如何解决