Python多处理队列管理器地址已在使用中
目前,我正试图在Python 3.6.7中实现不同进程之间的通信。我的想法是使用队列,因为命名管道是不够的 我的侦听器实现如下:Python多处理队列管理器地址已在使用中,python,queue,python-3.6,python-multiprocessing,Python,Queue,Python 3.6,Python Multiprocessing,目前,我正试图在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:
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)
我有一个作家的定义如下:
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)
由于您是从一个公共父进程启动侦听器和编写器,因此可以执行上述操作,在某个地方捕获地址(管道、文件等),然后将端口号传递给另一个进程
这样,您甚至可以在同一台计算机上同时并行运行测试的多个实例,而不会产生冲突。操作系统将确保您每次都获得一个未使用的端口。侦听器和写入器是否由一个共同的父进程启动?如果是单元测试:是。正在从threading.Thread()开始。