2016-04-01 59 views
4

我正在構建一個多線程的網絡爬蟲。如何獲得所有進程都可以訪問的地圖?

我啓動一個線程,獲取第一個鏈接並解析一些數據。然後,應該將這些鏈接添加到其他線程可以訪問的訪問列表中,並將這些數據添加到全局地圖中,該地圖將在程序完成時打印出來。然後線程啓動新的n新線程都在做同樣的事情。

如何設置所有線程都可以訪問的訪問站點的全局列表以及所有線程都可以寫入的全局映射。

回答

1

爲了澄清,erlang/elixir使用進程而不是線程。

鑑於元素的列表,一個通用的方法:

  • 一個叫processed空列表保存到ETS,限定詞,Mnesia的或一些DB。
  • 元素的新列表將根據processed列表進行過濾,因此不會不必要地重複該任務。
  • 對於過濾列表的每個元素,運行一個任務(進而產生一個進程),並對每個返回所需數據映射的元素執行一些工作。請參閱Task moduleTask.async/1Task.yield_many/2可能會有用。
  • 一旦所有的任務已經返回或產生,

    1. 所有的地圖或地圖部分數據被合併並且如果/被持久化的要求/爲宜。
    2. 其任務沒有崩潰或超時的元素被添加到數據庫中的processed列表中。
  • 崩潰或超時的任務可以以不同方式處理。

8

您不能在進程之間共享數據。這並不意味着你不能共享信息。

通常的方法是使用負責此作業的特殊進程(服務器):維護狀態;在你的情況下訪問鏈接的列表。

另一種方法是使用ETS(或Mnesia建立在ETS上的數據庫),其目的是在進程之間共享信息。

+0

通常,簡單地打包某些狀態的過程基於Agent。您可以發送消息來查詢狀態或獲取它。有關文檔,請參閱http://elixir-lang.org/getting-started/mix-otp/agent.html(是的,我知道鏈接粘貼在SO上不受歡迎,因此只是一個註釋:-)) – cdegroot

相關問題