2011-06-20 48 views
3

當使用--pool = eventlet選項運行我的芹菜工時,我收到了很多來自amqplib.client_0_8.method_framing.read_method的「IOError:Socket closed」異常。我也從eventlet.hubs.hub.switch中看到很多超時異常。芹菜eventlet任務有很多套接字錯誤

我使用一個類似於在https://gist.github.com/821848的async_manage.py腳本,運行類似作品:

./async_manage.py celeryd_detach -E --pool=eventlet --concurrency=120 --logfile=<path> 

這是一個已知的問題,或者是有什麼錯我的配置或設置?

我正在運行djcelery 2.2.4,Django 1.3和eventlet 0.9.15。

+1

你確定你的任務不會阻塞呼叫嗎? – asksol

+0

我是猴子修補每一個,但我不是100%肯定,沒有任何阻礙。找出答案的最佳方式是什麼,如果是的話我該怎麼辦? –

+0

猴子修補只修補了什麼事件小程序知道如何修補,因此您仍然可以使用那些未涵蓋的庫。看到這裏例如:http://unethicalblogger.com/2010/08/28/unclog-the-tubes-blocking-detection-in-eventlet.html – asksol

回答

5

這個問題是一些阻塞的代碼的副作用。我設法使用http://unethicalblogger.com/2010/08/28/unclog-the-tubes-blocking-detection-in-eventlet.html

中描述的eventlet選項來檢測阻止代碼。有2個地方發生了阻塞:DNS查找和MySQL數據庫訪問。我設法通過安裝dnspython包來解決第一個問題,第二個解決方案是使用eventlet中未公開的MySQLdb選項:

import eventlet 
eventlet.monkey_patch() 
eventlet.monkey_patch(MySQLdb=True)