我正在开发一个基本的抓取工具,它使用线程同时抓取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在评论中所建议的那样,我在supervisord配置中更改了工作目录,现在所有线程都按预期运行。虽然我仍然不明白为什么将工作目录设置到爬虫文件目录可以解决问题。也许有人知道主管如何管理流程可以解释?
答案 0 :(得分:1)
AFAIK python线程无法正确执行线程,因为它不是线程安全的。它只是为您提供了一个模拟同时运行代码的工具。您的代码仍然只使用1个核心。
https://wiki.python.org/moin/GlobalInterpreterLock
https://en.wikibooks.org/wiki/Python_Programming/Threading
因此,它可能不会产生更多的进程/线程。
我认为您应该使用多处理?
答案 1 :(得分:0)
我遇到了同样的沉默问题,但后来意识到我将守护进程设置为true,这导致了主管问题。
https://docs.python.org/2/library/threading.html#threading.Thread.daemon
所以答案是,自己运行脚本时daemon = true,在supervisor下运行时为false。
答案 2 :(得分:0)
只是说,我只是遇到了一个非常类似的问题。
在我的情况下,我正在研究低功耗机器(RaspberryPi),其中的线程专用于监听串行设备(/ dev / ttyUSB0上的Arduino nano)。代码在命令行上完美运行 - 但是串口读取线程在主管下停滞不前。
经过一些黑客攻击(并尝试所有选项),我尝试在无缓冲模式下运行python并设法解决问题!我从https://stackoverflow.com/a/17961520/741316得到了这个想法。
本质上,我只是用-u
标志调用python。