幾個星期前我開始用Python進行編程。我有一些Java的經驗,所以我設置它並不難。如何在Python中使用多線程/多處理時避免重複結果?
現在我有一個程序,它使用URLLib來抓取網站列表的源代碼。
我有數以千計的網站刮,所以我顯然希望使其成爲多線程或多處理(我真的不知道其中的差異)。
好的是我的多線程工作!但對我來說,這基本上毫無意義,因爲我的所有線程都在拼湊完全相同的網站,並且只給我一些重複的東西。
我該如何避免這個問題?感謝您的幫助提前:)
幾個星期前我開始用Python進行編程。我有一些Java的經驗,所以我設置它並不難。如何在Python中使用多線程/多處理時避免重複結果?
現在我有一個程序,它使用URLLib來抓取網站列表的源代碼。
我有數以千計的網站刮,所以我顯然希望使其成爲多線程或多處理(我真的不知道其中的差異)。
好的是我的多線程工作!但對我來說,這基本上毫無意義,因爲我的所有線程都在拼湊完全相同的網站,並且只給我一些重複的東西。
我該如何避免這個問題?感謝您的幫助提前:)
多線程和多處理之間的區別在Python中很重要,因爲全局解釋器鎖可以防止線程在解釋器中同時執行代碼。對於網頁抓取的目的,只要線程只執行web請求就可以使用線程(因此只有線程在等待時阻塞)。如果您還想要並行處理某些響應,最好使用multiprocessing
,以便每個子進程都擁有自己的解釋器,並且可以利用您的cpu內核。
關於重複的問題,可能存在將網站列表分發到線程或子進程的方式的錯誤。在multiprocessing
中,您有一個Queue
,它也是流程安全的(也是線程安全的)。這意味着,如果兩個子進程同時嘗試從隊列中獲取get
,則將從隊列中獲取順序項目,而不是同一個項目。
綜上所述,您應該在的put
每個站點中分別從主線程和get
中分別獲取每個工作線程或子進程。
如果沒有示例代碼,將很難提供幫助。請提供一個說明您的問題的[最小,完整的可驗證示例](https://stackoverflow.com/help/mcve)。 –
作爲一般的委託人,我建議你看一下'queue'模塊,你的線程可以從隊列中拉出項目而不需要重複。 –
我沒有提供我的代碼,因爲我想要一個普通答案,而不僅僅是一個解決方案對我的具體問題。 Ofer,謝謝你的回答。調查隊列解決了我的問題!我明白現在它是如何工作的。 –