python多线程中途跳出问题

在写多线程的时候遇到的问题,写了两个线程,一个线程是从固定网址等待响应内容,另外一个是解析网站响应内容。其中解析网站内容的线程存在一个前提条件,必须队列中存在响应内容才能解析,如果加入while in_q.empty() is not True,只要过程中存在空情况,整个循环解析就进行不下去。
等于说现在我只需要最后爬完所有网址判定从而进行一个循环退出,但中间队列空的时候不能退出。之前是因为想解决一开始判断队列为空值就直接跳出这个问题加了一个参数t,但运行中间也会存在这个问题,感觉需要一直监视队列不能为空。
想问一下怎么解决

from queue import Queue
from threading import Thread
import time
import requests
from bs4 import BeautifulSoup

def consumer(in_q):
    t = 1
    while True:
        t+=1
        print(t)
        if in_q.empty() == True and t > 2:
            print("空")
            break
        content = str(in_q.get().content, encoding='utf-8', errors='ignore')
        soup = BeautifulSoup(content, 'html.parser')
        nums = soup.find_all('h2', 'm-b-sm')
        for num in nums:
            print(num.text)
        in_q.task_done()

def producer(out_q):
    for i in range(1,11):
        url = rf"https://ssr4.scrape.center/page/{i}"
        print("#"*10,url)
        data = requests.get(url=url)
        out_q.put(data)

if __name__ == '__main__':
    start = time.time()
    q = Queue()
    # result_q = Queue()
    t1 = Thread(target=producer,args=(q,))
    t2 = Thread(target=consumer, args=(q,))
    t1.start()
    t2.start()
    q.join()
    end = time.time()
    print("time:", end - start)

循环没跳出来,加个值判断是否结束

引用 皆我百晓生 小程序回复内容作答:
问题出在你的consumer函数中,判断队列是否为空的逻辑有问题。因为你在每次循环开始的时候都在给t加1,所以就算队列不为空,t也会一直增加导致判断条件不满足。
你可以将t的初始化放在while循环外面,并且在每次成功获取到队列内容的时候将t重新置为1。这样只有在连续两次获取到空内容时才认为队列已经空了。

修改后的代码如下:

from queue import Queue
from threading import Thread
import time
import requests
from bs4 import BeautifulSoup

def consumer(in_q):
    t = 0
    while True:
        t += 1
        if in_q.empty() and t > 2:
            print("空")
            break
        content = str(in_q.get().content, encoding='utf-8', errors='ignore')
        soup = BeautifulSoup(content, 'html.parser')
        nums = soup.find_all('h2', 'm-b-sm')
        for num in nums:
            print(num.text)
        in_q.task_done()
        t = 0

def producer(out_q):
    for i in range(1,11):
        url = rf"https://ssr4.scrape.center/page/{i}"
        print("#"*10,url)
        data = requests.get(url=url)
        out_q.put(data)
 
if __name__ == '__main__':
    start = time.time()
    q = Queue()
    # result_q = Queue()
    t1 = Thread(target=producer,args=(q,))
    t2 = Thread(target=consumer, args=(q,))
    t1.start()
    t2.start()
    q.join()
    end = time.time()
    print("time:", end - start)

这样修改后,当队列连续两次为空时,就会退出循环。

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^