2014-09-18 61 views
2

我試圖儘可能快地拉動信息一大堆,並有下面的代碼,以幫助它:Django的對象和多

pool = Pool() 
products = Post.objects.filter(affiliate_product_url=None) 
res = pool.map_async(get_info, products) 
w = res.get() 
pool.close() 

當運行它返回一個

File "<console>", line 1, in <module> 
File "scripts/image_affiliate_pull.py", line 113, in <module> 
    w = res.get() 
File "C:\Python27\lib\multiprocessing\pool.py", line 558, in get 
    raise self._value 
TypeError: expected string or Unicode object, NoneType found 

從我的搜索這可能與酸洗有關嗎?我如何才能最好地使它工作?爲什麼它以這種方式工作的解釋將是非常寶貴的:D

+0

'TypeError'正在'get_info'中引發。由於'multiprocessing'的侷限性,儘管如此,你不能從get_info中獲得回溯。將'get_info'封裝在'try' /'except'塊中,並在'except'塊內調用'traceback.print_exc()'來查看真正的回溯。它應該可以幫助你弄清楚什麼是錯的。 – dano 2014-09-18 23:58:10

+0

我加了。我知道get_info的工作原理是因爲我可以通過在Post.objects.filter(affiliate_product_url = None)]中用'[get_info(p)for p'線性調用函數來完美運行它,所以我認爲它純粹是一個多處理/ map_async問題。你怎麼看? – robert 2014-09-19 00:16:52

+0

*絕對* *來自'get_info'。引發異常的那行是'ApplyResult.get'的部分,它引發了從子進程返回的異常對象。您需要在子進程本身中打印完整的回溯,以找出故障實際發生的位置。在'get_info'中有一個對象試圖訪問子進程中未設置的對象。你在哪個平臺上運行這個平臺?你想在'get_info'中使用任何全局變量嗎? – dano 2014-09-19 00:24:50

回答

1

如果得到回溯是一個問題,那麼爲了調試的緣故,您可以使用multiprocessing.pool.ThreadPool而不是常規進程池。它具有完全相同的接口,只有你沒有在進程之間傳遞迴溯的問題。

可能的警告 - 不確定線程​​將如何在Web服務器內運行。