python manager与basemanager_使用Python多处理管理器(BaseManager/SyncManager)与远程计算机共享队列时出现管道中断...
在上個月,當我們試圖使用Python2.6.x多處理包在幾個不同的(linux)計算機之間共享隊列時,我們遇到了一個持久的問題。我也直接向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的管理器托管)。
這個問題的特殊之處在于,如果我們在一臺機器上連接到這個共享隊列(我們稱之為machine A),即使是從許多并發進程,我們似乎也不會遇到問題。只有當我們從其他機器(我們稱之為machines B and C)連接到隊列(同樣,使用擴展了多處理同步管理器并且當前沒有添加任何附加功能的類)并在隊列內外運行大量項目時,我們才會遇到問題。
這就好像python的多處理包處理本地連接(即使它們仍然使用相同的manager.connect()連接方法)的方式與machine A相同,但是當至少從machines B or C中的一個同時進行遠程連接時,我們會得到斷管錯誤。
在我的團隊所做的所有閱讀中,我們認為問題與鎖定有關。我們認為也許不應該使用Queue.Queue,而應該使用multiprocessing.Queue,但是我們進行了切換,問題仍然存在(我們還注意到SyncManager自己的共享隊列是Queue.Queue的一個實例)。
我們正在討論如何調試這個問題,因為它很難重現,但確實相當頻繁(如果我們插入和.get()隊列中的許多項,每天會發生很多次)。
我們創建的方法get_from_queue嘗試用隨機睡眠間隔從隊列中重試獲取該項約10次,但似乎如果失敗一次,它將失敗10次(這使我相信,到管理器的.register()和.connect()可能沒有提供到服務器的另一個套接字連接,但我無法確認這可以通過閱讀文檔或查看Python內部源代碼來實現)。
有誰能提供一些我們可能看到的地方,或者我們如何跟蹤實際發生的事情?
如果管道損壞,我們如何使用multiprocessing.BaseManager或multiprocessing.SyncManager啟動新連接?
我們怎樣才能從一開始就防止管道破裂呢?
總結
以上是生活随笔為你收集整理的python manager与basemanager_使用Python多处理管理器(BaseManager/SyncManager)与远程计算机共享队列时出现管道中断...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暗渡剧情介绍
- 下一篇: 恒宇双星什么时候还能升级