我几周前就开始在Python进行编程。我对Java有一些经验,所以我很难设置。
现在,我有一个程序,该程序使用Urllib刮擦网站列表的源代码。
我有成千上万的网站需要刮擦,所以我显然希望使其进行多线程或多处理(我真的不知道区别(。
好处是我的多线程起作用!但这对我来说基本毫无意义,因为我所有的线程都在刮擦完全相同的站点,但除了重复外,什么都没有。
如何避免这个问题?感谢您提前的帮助:(
多线程和多处理之间的差异在Python中很重要,因为全局解释器锁定会阻止线程在解释器中同时执行代码。为了进行Web刮擦目的,只要线程仅执行Web请求,就可以使用线程(因此,在等待时只有线程块(。如果您还想并行处理响应,最好使用multiprocessing
,以便每个子过程都有自己的解释器,并且可以利用CPU内核。
关于重复项的问题,您可能会有一个错误将站点列表分配到线程或子过程的方式。在multiprocessing
中,您有一个Queue
,该CC_3是过程安全的(也是线程安全(。这意味着,如果两个子过程尝试同时从队列中 get
,则将从队列中获得顺序项目,而不是同一项目。
总而言之,您应该从主线程中的Queue
中的每个站点,然后从每个工作人员或子过程中进行get
。