我正在構建一個多線程的網絡爬蟲。如何獲得所有進程都可以訪問的地圖?
我啓動一個線程,獲取第一個鏈接並解析一些數據。然後,應該將這些鏈接添加到其他線程可以訪問的訪問列表中,並將這些數據添加到全局地圖中,該地圖將在程序完成時打印出來。然後線程啓動新的n
新線程都在做同樣的事情。
如何設置所有線程都可以訪問的訪問站點的全局列表以及所有線程都可以寫入的全局映射。
我正在構建一個多線程的網絡爬蟲。如何獲得所有進程都可以訪問的地圖?
我啓動一個線程,獲取第一個鏈接並解析一些數據。然後,應該將這些鏈接添加到其他線程可以訪問的訪問列表中,並將這些數據添加到全局地圖中,該地圖將在程序完成時打印出來。然後線程啓動新的n
新線程都在做同樣的事情。
如何設置所有線程都可以訪問的訪問站點的全局列表以及所有線程都可以寫入的全局映射。
爲了澄清,erlang/elixir使用進程而不是線程。
鑑於元素的列表,一個通用的方法:
processed
空列表保存到ETS,限定詞,Mnesia的或一些DB。processed
列表進行過濾,因此不會不必要地重複該任務。一旦所有的任務已經返回或產生,
processed
列表中。崩潰或超時的任務可以以不同方式處理。
您不能在進程之間共享數據。這並不意味着你不能共享信息。
通常的方法是使用負責此作業的特殊進程(服務器):維護狀態;在你的情況下訪問鏈接的列表。
另一種方法是使用ETS(或Mnesia建立在ETS上的數據庫),其目的是在進程之間共享信息。
通常,簡單地打包某些狀態的過程基於Agent。您可以發送消息來查詢狀態或獲取它。有關文檔,請參閱http://elixir-lang.org/getting-started/mix-otp/agent.html(是的,我知道鏈接粘貼在SO上不受歡迎,因此只是一個註釋:-)) – cdegroot