gpt4 book ai didi

Python模块函数在线程中立即返回

转载 作者:太空宇宙 更新时间:2023-11-03 15:37:00 24 4
gpt4 key购买 nike

我已经用 python 编写了几个 Twitter 抓取工具,并且正在编写另一个脚本来让它们保持运行,即使它们遇到超时、断开连接等问题。

我目前的解决方案如下:

每个scraper文件中都有一个doScrape/1函数,它将启动一个scraper并运行一次,例如:

def doScrape(logger):
try:
with DBWriter(logger=logger) as db:
logger.log_info("starting", __name__)
s = PastScraper(db.getKeywords(), TwitterAuth(), db, logger)
s.run()
finally:
logger.log_info("Done", __name__)

其中 run 是一个近乎无限的循环,除非出现异常,否则不会中断。

为了一次运行每种刮刀,我使用此代码(带有一些额外的导入):

from threading import Thread

class ScraperThread(Thread):
def __init__(self, module, logger):
super(ScraperThread, self).__init__()
self.module = module # Module should contain a doScrape(logger) function
self.logger = logger


def run(self):
while True:
try:
print "Starting!"
print self.module.doScrape
self.module.doScrape(self.logger)
except: # if for any reason we get disconnected, reconnect
self.logger.log_debug("Restarting scraper", __name__)

if __name__ == "__main__":
with Logger(level="all", handle=open(sys.argv[1], "a")) as l:
past = ScraperThread(PastScraper, l)
stream = ScraperThread(StreamScraper, l)
past.start()
stream.start()
past.join()
stream.join()

但是,看来我从上面对 doScrape 的调用立即返回,因此“开始!”在控制台中重复打印,并且finally block 中的“完成”消息不会写入日志,而单独运行时如下所示:

if __name__ == "__main__":
# Example instantiation
from Scrapers.Logging import Logger
with Logger(level="all", handle=open(sys.argv[1], "a")) as l:
doScrape(l)

正如预期的那样,代码永远运行。我有点困惑。

有什么愚蠢的事情我可能错过了吗?

最佳答案

摆脱 run() 方法中的尿布模式,如下所示:摆脱那个包罗万象的异常处理程序。然后您可能会在那里打印错误。我认为 DBWriter 或您从 doScrape 函数调用的其他代码可能有问题。也许它不是线程安全的。这可以解释为什么从主程序直接运行它可以工作,但从线程调用它会失败。

关于Python模块函数在线程中立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42457679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com