[英]How do I multiprocess a loop in a list
我有一項可以使用python輕松完成的任務,但是完成腳本花費的時間太長。 因此,我想將其更改為多處理腳本。 我不知道如何,我嘗試使用threading
但這似乎不適合這種情況。
我需要將所有頁面的URL放入名為page_list
的列表中,然后獲取這些頁面的內容並使用BeautifulSoup來獲取某些內容。 這是我所擁有的:
some_list_from_page_content_1=[]
some_list_from_page_content_2=[]
class sth():
def get_rv_content(self,somevar_from_another_method):
...
page_list=[page1,page2,page3,page4....]
for i in range(len(page_list)):
Page_Content=session.get(page_list[i],headers=req_header).content
some_list_from_page_content_1=[x for x in Page_Content if foo]+some_list_from_page_content_1
some_list_from_page_content_2=[x for x in Page_Content if foo]+some_list_from_page_content_2
嘗試使用dask
並行化。
基本上,use可以通過使用dask.delayed
和dask.compute
實現並行地圖功能。 例如:
從dask導入延遲,從導入睡眠時間計算
def fun(x):
sleep(x)
return x
ls = range(10)
res = [delayed(sleep)(x) for x in ls]
print res
將打印延遲列表(以納秒為單位):
[Delayed('fun-790acf2b-873d-4fd8-be07-2bc8111c4e01'), Delayed('fun-3c8c0c8e-699e-4029-ad12-8b5daefe13ad'), Delayed('fun-9da2e125-1910-4761-b1ad-23efa5f31096'), Delayed('fun-19a15dd5-5e4d-4103-8099-f3457b3cfc3a'), Delayed('fun-56d55b5e-8bb3-4ad9-8d7f-50a6509832b6'), Delayed('fun-d7efe939-7828-4d04-9c1c-60421983141f'), Delayed('fun-044ce640-7537-477e-bff8-9b0c92e62a7a'), Delayed('fun-5b833609-a268-4ef5-a8f1-acb4be4079d8'), Delayed('fun-f33e179e-7466-4763-ab08-ab735dccd8a8'), Delayed('fun-56b5eb76-85d4-4f03-8805-eeb891a14d0d')]
然后使用compute
將實際執行函數(癱瘓):
print compute(res)
將打印結果(更快):
([0, 1, 2, 3, 4, 5, 6, 7, 8, 9],)
注意-要獲取結果list
查找compute(res)[0]
因此,在您的情況下-只需將for循環中函數的執行替換為延遲,然后對最終結果運行計算即可。
請注意,您可能需要逐個運行計算元素:
print [compute(r) for r in res]
[(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.