【发布时间】:2016-04-02 11:14:21
【问题描述】:
我正在构建一个多线程网络爬虫。
我启动了一个线程,它首先获取n href 链接并解析一些数据。然后它应该将这些链接添加到其他线程可以访问的已访问列表,并将数据添加到将在程序完成时打印的全局地图。然后线程启动新的n 新线程,它们都在做同样的事情。
如何设置所有线程都可以访问的已访问站点的全局列表以及所有线程也可以写入的全局地图。
【问题讨论】:
标签: multithreading erlang elixir
我正在构建一个多线程网络爬虫。
我启动了一个线程,它首先获取n href 链接并解析一些数据。然后它应该将这些链接添加到其他线程可以访问的已访问列表,并将数据添加到将在程序完成时打印的全局地图。然后线程启动新的n 新线程,它们都在做同样的事情。
如何设置所有线程都可以访问的已访问站点的全局列表以及所有线程也可以写入的全局地图。
【问题讨论】:
标签: multithreading erlang elixir
您不能在进程之间共享数据。这并不意味着您不能共享信息。
通常的方法是要么使用一个特殊的进程(服务器)来负责这项工作:维护一个状态;要么在您的情况下,访问链接列表。
另一种方法是使用ETS(或基于 ETS 构建的数据库 Mnesia),它旨在在进程之间共享信息。
【讨论】:
澄清一下,erlang/elixir 使用进程而不是线程。
给定一个元素列表,一个通用的方法:
processed 的空列表保存到 ets、dets、mnesia 或某些 DB。processed 列表进行过滤,因此不会不必要地重复任务。一旦所有任务都返回或产生,
processed 列表中。可以以不同方式处理崩溃或超时的任务。
【讨论】: