如何在Python中进行多线程/多处理时避免重复结果?

时间:2017-06-27 10:51:53

标签: python

几周前我开始用Python编程。我有一些Java经验,所以设置起来并不困难。

现在我有一个程序使用URLLib来抓取网站列表的源代码。

我有成千上万的网站要抓,所以我显然希望让它多线程或多处理(我真的不知道其中的区别)。

好处是我的多线程工作!但这对我来说基本上没有意义,因为我所有的线程都在抓取完全相同的网站,除了重复之外我什么都没有。

如何避免此问题?感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

多线程和多处理之间的区别在python中很重要,因为全局解释器锁可以防止线程在解释器中同时执行代码。对于Web抓取目的,只要您的线程只执行Web请求(以便在等待时只有线程阻塞),就可以使用线程。如果您还想并行处理响应,最好使用multiprocessing,以便每个子进程都拥有自己的解释器,并且可以利用您的cpu核心。

关于重复项的问题,将网站列表分发到线程或子进程的方式可能存在错误。在multiprocessing中,您有一个Queue,它是进程安全的(也是线程安全的)。这意味着如果两个子进程同时从队列中尝试get,它们将从队列中获得顺序项,而不是相同的。

总之,您应该put来自主线程的Queue中的每个站点,然后来自每个工作线程或子进程的get