代码之家  ›  专栏  ›  技术社区  ›  olegario

粘蜘蛛花了太长时间才被关闭

  •  1
  • olegario  · 技术社区  · 7 年前

    基本上,我有一个文件名为 spiders.py 在其中,我配置了所有的爬行器,然后使用一个爬虫启动所有的爬行器。以下是此文件的源代码:

    from scrapy import spiderloader
    from scrapy.crawler import CrawlerProcess
    from scrapy.utils.project import get_project_settings
    from navigator import *
    
    
    def main():
      settings = get_project_settings()
      spider_loader = spiderloader.SpiderLoader.from_settings(settings)
      process = CrawlerProcess(settings=settings)
      for spider_name in spider_loader.list():
          process.crawl(spider_name)
    
      process.start()
    
    
    if __name__ == '__main__':
      main()
    

    我试图实现的是从另一个脚本中使用 subprocess 模块,并在执行5分钟后,关闭所有spider(仅使用一个) SIGTERM ). 负责此目标的文件是 monitor.py :

    from time import sleep
    import os
    import signal
    import subprocess
    
    def main():
      spiders_process = subprocess.Popen(["python", "spiders.py"], stdout=subprocess.PIPE,
                                          shell=False, preexec_fn=os.setsid)
      sleep(300)
      os.killpg(spiders_process.pid, signal.SIGTERM)
    
    if __name__ == '__main__':
      main()
    

    当主线程唤醒时,终端说 2018-07-19 21:45:09 [scrapy.crawler] INFO: Received SIGTERM, shutting down gracefully. Send again to force . 但即使在这条消息发出后,蜘蛛仍会继续丢弃网页。我做错了什么?

    OBS公司 :可以发射内部的所有蜘蛛 蜘蛛.py 不阻塞主进程?

    1 回复  |  直到 7 年前
        1
  •  0
  •   John Smith    7 年前

    我相信,当scrapy收到SIGTERM时,它会先等待完成所有已发送/已调度的请求,然后尝试优雅地关闭。最好的办法是限制请求的数量或并发请求,以便更快地完成( CONCURRENT_REQUESTS / CONCURRENT_REQUESTS_PER_DOMAIN 默认分别为16和8)或发送两个SIGTERM指令scrapy立即退出。

    OBS:有可能把里面所有的蜘蛛都烧掉蜘蛛.py不阻塞主进程?

    process.start() 启动twisted reactor(twisted main event loop),这是一个阻塞调用,要绕过它并在reactor启动后运行更多代码,您可以安排函数在循环内运行。本手册的第一个片段应该给您一个想法: https://twistedmatrix.com/documents/current/core/howto/time.html .

    但是,如果这样做,则必须确保调度的代码也必须是非阻塞的,否则,当循环暂停执行太长时间时,可能会发生不好的事情。比如 time.sleep() 必须以扭曲的等效形式重写。