如何拥有所有进程都可以访问的Map?

时间:2016-04-01 17:08:41

标签: multithreading erlang elixir

我正在构建一个多线程网络爬虫。

我启动了一个获得第一个n href链接并解析一些数据的线程。然后,它应该将这些链接添加到其他线程可以访问的“访问”列表,并将数据添加到将在程序完成时打印的全局映射。然后线程启动新的n个新线程,它们都做同样的事情。

如何设置所有线程都可以访问的访问网站的全局列表以及所有线程也可以写入的全局地图。

2 个答案:

答案 0 :(得分:8)

您无法在进程之间共享数据。这并不意味着您无法共享信息。

通常的方法是使用负责此工作的特殊进程(服务器):维持状态;在您的情况下,访问链接列表。

另一种方法是使用ETS(或Mnesia数据库构建在ETS上),用于在进程之间共享信息。

答案 1 :(得分:1)

为了澄清,erlang / elixir使用进程而不是线程。

给出一个元素列表,一个通用的方法:

  • 名为processed的空列表会保存到ets,dets,mnesia或某些数据库。
  • 新元素列表将根据processed列表进行过滤,以便不会不必要地重复任务。
  • 对于已过滤列表的每个元素,运行一个任务(进而生成一个进程)并对返回所需数据映射的每个元素执行一些操作。请参阅Task module Task.async/1Task.yield_many/2可能会有用。
  • 完成所有任务后,

    1. 地图中数据的所有地图或部分都已合并,如果/需要/适当,可以保留。
    2. 任务未崩溃或超时的元素将添加到数据库中的processed列表中。
  • 崩溃或超时的任务可以采用不同的方式处理。