Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理队列管理器地址已在使用中_Python_Queue_Python 3.6_Python Multiprocessing - Fatal编程技术网

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

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:

目前,我正试图在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)
我有一个作家的定义如下:

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()开始。