当我在子进程中使用python-requests时,我的Python程序意外退出

时间:2019-04-24 03:19:22

标签: python python-requests multiprocessing

在我的Spider项目中,我有一个代码段,用于抓取“ sina weibo”最热门的主题链接,该链接将提供我的蜘蛛。当我进行单次测试时,它可以完美工作。但是,当我在Process中使用它们时,代码段导致python意外退出。我发现失败的原因是我在代码段中使用了python-requests,因此,当我用urllib3重写它时,它可以正常工作。

此代码在我的macOS Mojava中运行。 Python版本为“ 3.7”,而python-requests版本为“ 2.21.0”。

"""
The run_spider function periodically crawls the link and feed to the spiders
"""
@staticmethod
def run_spider():
    try:
        cs = CoreScheduler()
        while True:
            cs.feed_spider()
            first_time = 3 * 60
            while not cs.is_finish():
                time.sleep(first_time)
                first_time = max(10, first_time // 2)
            cs.crawl_done()
            time.sleep(SPIDER_INTERVAL)
    except Exception as e:
        print(e)
"""
The cs.feed_spider() just crawl and parse the page, it will return a generator of links. The code is shown below.
"""
def get_page(self):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-cn',
        'Host': 's.weibo.com',
        'Accept-Encoding': 'br, gzip, deflate',
        "User-Agent": 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_3) AppleWebKit/605.1.15\
         (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1',

        }
    # res = requests.get(self.TARGET_URL, headers=headers)
    http = urllib3.PoolManager()
    res = http.request("GET", self.TARGET_URL, headers=headers)
    if 200 == res.status:
        return res.data
    else:
        return None
"""
The crawler will become a child process. like below.
"""
def run(self):
    spider_process = Process(target=Scheduler.run_spider)
    spider_process.start()

我希望使用python-requests可以工作,但是它导致程序意外退出。当我使用urllib3重写代码时,程序运行正常。我不明白为什么。

1 个答案:

答案 0 :(得分:0)

您已开始该过程,但我看不到您在等待它。 join()函数将导致主线程暂停执行,直到spider_process线程完成其执行为止。

def run(self):
    spider_process = Process(target=Scheduler.run_spider)
    spider_process.start()
    spider_process.join()

以下是官方join()文档的链接:https://docs.python.org/3/library/threading.html#threading.Thread.join