gpt4 book ai didi

Python 多处理队列管理器地址已在使用中

转载 作者:行者123 更新时间:2023-12-01 08:47:12 24 4
gpt4 key购买 nike

目前我正在尝试在Python 3.6.7中实现不同进程之间的通信。我的想法是使用队列,因为命名管道还不够。

我有一个监听器,实现如下:

result_queue = queue.Queue()
BaseManager.register('queue', callable=lamda: result_queue)
queue_manager = BaseManager(address=('127.0.0.1', 50000))
queue_manager.start()
while do_run:
data = result_queue.get()
print(data)
queue_manager.shutdown()

我有一个作家定义如下:

BaseManager.register('queue')
manager = BaseManager(address=('127.0.0.1', 50000))
manager.connect()
queue = manager.queue()
queue.put(message)

问题是,当我在 Docker 环境中运行单元测试时,我不断收到以下错误:

 OSError: [Errno 98] Address already in use

第一次测试似乎运行良好,但在接下来的所有测试中仍然出现上述错误。

我的猜测是 BaseManager 在端口上遇到了“TIME_WAIT”,但似乎我无法设置一个选项来重新使用套接字而不是等待。

我在这里做错了什么,还是有办法强制重复使用套接字?

最佳答案

解决此类问题的一个简单方法是让操作系统选择一个端口:

queue_manager = BaseManager(address=('127.0.0.1', 0)) # setting the port to 0 allows the OS to choose.
print(queue_manager.address)

由于您是从公共(public)父进程启动监听器和写入器,因此您可以执行上述操作,捕获某处的地址(管道、文件等),然后将端口号传递给其他进程。

这样,您甚至可以同时在同一台计算机上并行运行测试的多个实例,而不会发生冲突。操作系统将确保您每次都获得未使用的端口。

关于Python 多处理队列管理器地址已在使用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53259708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com