我正在使用一个基本的爬虫,该爬虫使用线程同时爬网5个网站。
对于每个站点,它都会创建一个新线程。当我从 shell 运行程序时,输出日志表明所有5个线程均按预期运行。
但是当我将这个程序作为supervisord程序运行时,日志表明每次仅运行2个线程!日志表明所有5个线程都已启动,但是仅执行了其中两个相同的线程,其余线程卡住了。
我不明白为什么从 shell 程序运行时以及从主管运行时出现这种不一致的原因。有没有我没有考虑到的东西?
这是创建线程的代码:
for sid in entries:
url = entries[sid]
threading.Thread(target=self.crawl_loop, \
args=(sid, url)).start()
更新:
正如tdelaney在评论中所建议的那样,我在监管配置中更改了工作目录,现在所有线程都按预期运行。尽管我仍然不明白,为什么将工作目录设置为搜寻器文件目录可以解决此问题。也许某个知道主管如何管理流程的人可以解释一下?
最佳答案
AFAIK python线程不能正确执行线程,因为它不是线程安全的。它只是为您提供了一种工具来模拟代码的同时运行。您的代码仍将仅使用1个内核。
https://wiki.python.org/moin/GlobalInterpreterLock
https://en.wikibooks.org/wiki/Python_Programming/Threading
因此,有可能它不会产生更多的进程/线程。
我应该使用多重处理吗?
https://docs.python.org/2/library/multiprocessing.html