python manager与basemanager_使用Python多处理管理器(BaseManager / SyncManager)与远程计算机共享队列时的断开管道...

在上个月,当我们尝试使用它在几个不同的(

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的管道发生故障的情况下,我们如何开始新的连接?

首先如何防止破管?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值