Python 多处理队列管理器地址已在使用
Python multiprocessing queue manager address already in use
目前我正在尝试在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',但我似乎无法设置一个选项来重新使用套接字而不是等待。
我是不是做错了什么或者有什么方法可以强制重新使用套接字?
解决此类问题的一种简单方法是让 OS 选择一个端口:
queue_manager = BaseManager(address=('127.0.0.1', 0)) # setting the port to 0 allows the OS to choose.
print(queue_manager.address)
由于您是从公共父进程启动侦听器和编写器,因此您可以执行上述操作,在某处捕获地址(管道、文件等),然后将端口号传递给其他进程。
这样,您甚至可以 运行 在同一台机器上同时并行测试多个实例而不会发生冲突。 OS 将确保您每次都获得一个未使用的端口。
目前我正在尝试在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',但我似乎无法设置一个选项来重新使用套接字而不是等待。
我是不是做错了什么或者有什么方法可以强制重新使用套接字?
解决此类问题的一种简单方法是让 OS 选择一个端口:
queue_manager = BaseManager(address=('127.0.0.1', 0)) # setting the port to 0 allows the OS to choose.
print(queue_manager.address)
由于您是从公共父进程启动侦听器和编写器,因此您可以执行上述操作,在某处捕获地址(管道、文件等),然后将端口号传递给其他进程。
这样,您甚至可以 运行 在同一台机器上同时并行测试多个实例而不会发生冲突。 OS 将确保您每次都获得一个未使用的端口。