2009-11-03 89 views
2

我需要在Web應用程序中執行耗時的任務。 由於任務可能非常繁重以至於他們只能在多個線程上運行,所以用戶不必在幾分鐘內查看加載頁面。Python中的多線程隊列

所以我認爲多線程隊列將是一個很好的解決方案。 添加到隊列中的每個對象實例都應該在其自己的線程上運行。

我有一個基本的想法,從哪裏開始,但我敢打賭,有很多更好的解決方案已經寫入或在你的大腦;)。

我的解決辦法隊列應該什麼樣子:

[ 
[ 
    obj_instance_1,[ 
        (function_1, function_args_1, priority_1), 
        (function_2, function_args_2, priority_2), 
       ] 
], 
[ 
    obj_instance_2,[ 
        (function_n, function_args_n, priority_n), 
       ] 
] 
] 

其中[]是列表和()的元組。

+0

您可能想看看django-lineup(http://code.google.com/p/django-lineup/) – ohnoes 2009-11-03 10:24:44

回答

2

您只需要您的元素來擴展threading.Thread並使用Conditions()來實現producer,consumer系統。

我會用自己的併發控制和一個add()方法維護一個線程池,允許其他代碼將線程添加到池中。

Here is the documentation for Python threading它幾乎遵循其他線程實現的約定......沒有什麼可怕的。

1

我不知道很多關於Python,但你所描述聽起來像一個線程池是什麼 - 這是一個快速谷歌

http://pypi.python.org/pypi/threadpool/

+0

+1此項目顯示了很好地使用標準隊列模塊執行任務 – 2009-11-03 12:39:00

2

kamaelia提供工具來提取併發線程或過程等。

+1

爲什麼要重新創建Kamaelia已經爲此提供了一個測試框架。 – 2009-11-03 10:49:30

6

Python標準庫Queue模塊已經是線程安全的並且已知並且應該滿足您的要求。

這是一篇不錯的論文Task Queue Implementation Pattern,它討論瞭如何使用隊列來處理任務隊列。

+0

+1,很好的答案。我會在隊列中看看自己。來自C背景,你往往只是重新實現:P – 2009-11-03 11:34:16

0

我建議你看看beanstalkdgearman

讓您的Web服務器成爲一臺Web服務器,並通過將它們移動到一個外部工作人員隊列中,從而獨立且更安全地擴展長時間運行的作業。

0

我建議在多線程庫中使用process pools。這是一個內置的庫,並且抽象出您所需要的大部分實現,特別是因爲池在列表上工作並且您的數據已經以列表的形式出現。您可以將其與池的map_async成員函數一起使用,並在完成特定任務時分配回調以通知用戶。