在上个月,当我们尝试使用它在几个不同的(
linux)计算机之间共享队列时,我们在
Python 2.6.x多处理包中遇到了一个持久的问题.我也直接向Jesse Noller提出了这个问题,因为我们还没有发现任何解释StackOverflow,Python文档,源代码或其他在线的问题.
我们的工程师团队无法解决这个问题,我们已经向python用户群中的不少人提出了这个问题.我希望有人能够发现一些洞察力,因为我觉得我们正在做一些不正确的事情,但是太靠近这个问题,看看它是什么.
这是症状:
Traceback (most recent call last):
File "/var/django_root/dev/com/brightscope/data/processes/daemons/deferredupdates/servers/queue_server.py", line 65, in get_from_queue
return queue, queue.get(block=False)
File "", line 2, in get
File "/usr/local/lib/python2.6/multiprocessing/managers.py", line 725, in _callmethod
conn.send((self._id, methodname, args, kwds))
IOError: [Errno 32] Broken pipe
(我在一个共享队列对象上显示我们的代码调用queue.get()的方式,这个对象由一个延伸SyncManger的管理员主持).
关于这个问题的特殊之处在于,如果我们在一台机器上连接到这个共享队列(我们称之为这台机器A),即使是很多并发进程,我们似乎也没有遇到问题.只有当我们连接到队列(再次使用扩展多进程SyncManager并且目前不添加附加功能的类)与其他机器(我们称之为这些机器B和C)并运行大量的项目进出队列同时我们遇到一个问题.
就像python的多处理软件包处理本地连接(即使它们仍然使用相同的manager.connect()连接方法),它的工作方式是从机器A工作,但是远程连接是从至少一个机器B或我们得到一个断线错误.
在我的团队完成的所有阅读中,我们认为问题与锁定有关.我们认为也许我们不应该使用Queue.Queue,而是multiprocessing.Queue,但是我们切换并且问题持续存在(我们也注意到SyncManager自己的共享队列是Queue.Queue的一个实例).
我们正在拉扯我们的头发关于如何调试问题,因为它很难重现,但确实发生相当频繁(如果我们插入和.get()从队列中的大量项目,每天多次).
我们创建的方法get_from_queue尝试从随机睡眠间隔重新获取队列中的项目〜10次,但似乎如果它失败一次,它将全部失败十次(这导致我相信.register()和. connect()到管理器可能不会给服务器提供另一个套接字连接,但是我无法通过阅读文档或查看Python内部源代码来确认.
任何人都可以提供任何见解,看看我们可能会看到什么,或者我们如何跟踪实际发生的情况?
在使用多处理器BaseManager或multiprocessing.SyncManager的管道发生故障的情况下,我们如何开始新的连接?
首先如何防止破管?