簡體   English   中英

如何對列表中的循環進行多處理

[英]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.delayeddask.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM