当前,我正在尝试在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”,但似乎我无法设置一个选项来重用套接字而不是等待。
我在这里做错什么了吗,还是有办法强制重新使用套接字?
答案 0 :(得分:1)
解决此类问题的一种简单方法是让操作系统选择端口:
queue_manager = BaseManager(address=('127.0.0.1', 0))
print(queue_manager.adddress)
由于您是从公共父进程启动侦听器和编写器的,因此您可以执行上述操作,在某个位置(管道,文件等)捕获地址,然后将端口号传递给其他进程。
这样,您甚至可以同时在同一台计算机上并行运行测试的多个实例,而不会发生冲突。操作系统将确保您获得的端口每次都未被使用。