2017-06-27 58 views
-3

幾個星期前我開始用Python進行編程。我有一些Java的經驗,所以我設置它並不難。如何在Python中使用多線程/多處理時避免重複結果?

現在我有一個程序,它使用URLLib來抓取網站列表的源代碼。

我有數以千計的網站刮,所以我顯然希望使其成爲多線程或多處理(我真的不知道其中的差異)。

好的是我的多線程工作!但對我來說,這基本上毫無意義,因爲我的所有線程都在拼湊完全相同的網站,並且只給我一些重複的東西。

我該如何避免這個問題?感謝您的幫助提前:)

+3

如果沒有示例代碼,將很難提供幫助。請提供一個說明您的問題的[最小,完整的可驗證示例](https://stackoverflow.com/help/mcve)。 –

+0

作爲一般的委託人,我建議你看一下'queue'模塊,你的線程可以從隊列中拉出項目而不需要重複。 –

+0

我沒有提供我的代碼,因爲我想要一個普通答案,而不僅僅是一個解決方案對我的具體問題。 Ofer,謝謝你的回答。調查隊列解決了我的問題!我明白現在它是如何工作的。 –

回答

0

多線程和多處理之間的區別在Python中很重要,因爲全局解釋器鎖可以防止線程在解釋器中同時執行代碼。對於網頁抓取的目的,只要線程只執行web請求就可以使用線程(因此只有線程在等待時阻塞)。如果您還想要並行處理某些響應,最好使用multiprocessing,以便每個子進程都擁有自己的解釋器,並且可以利用您的cpu內核。

關於重複的問題,可能存在將網站列表分發到線程或子進程的方式的錯誤。在multiprocessing中,您有一個Queue,它也是流程安全的(也是線程安全的)。這意味着,如果兩個子進程同時嘗試從隊列中獲取get,則將從隊列中獲取順序項目,而不是同一個項目。

綜上所述,您應該在的put每個站點中分別從主線程和get中分別獲取每個工作線程或子進程。

相關問題