【问题标题】:Python threading not stopping although daemon set to True尽管守护进程设置为 True,但 Python 线程并没有停止
【发布时间】:2018-11-24 16:15:42
【问题描述】:

我认为这是一个显而易见的问题,但我正在制作一个脚本,它使用线程来测试代理,一旦找到一定数量的代理就应该停止。当我运行它时,如果满足条件,线程将停止生成输出,但程序不会关闭。我看过其他类似的问题,但似乎无法成功实施。不胜感激。

import queue
import threading

import time   
import urllib.request

class ThreadUrl(threading.Thread):

    def __init__(self, queue, working_proxies):
        threading.Thread.__init__(self)
        self.queue = queue
        self.working_proxies = working_proxies

    def run(self):
        while len(self.working_proxies)<5:

            proxy = self.queue.get()

            try:
                proxy_handler = urllib.request.ProxyHandler({'http': proxy})
                opener = urllib.request.build_opener(proxy_handler)
                opener.addheaders = [('User-agent',
                                      'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')]
                urllib.request.install_opener(opener)
                req = urllib.request.Request('http://www.wikipedia.org')
                sock=urllib.request.urlopen(req)
                print(f'{proxy} works')
                with appending_lock:
                    self.working_proxies.append(proxy)

            except urllib.request.HTTPError as e:
                print('Error code: ', e.code)

            except Exception as detail:
                print("ERROR:", detail)

            self.queue.task_done()


def main(proxies, working_proxies):
    for i in range(5):
        t = ThreadUrl(queue,working_proxies)
        t.daemon = True
        t.start()


        for proxy in proxies:
            queue.put(proxy)

    queue.join()


if __name__ == '__main__':
    start = time.time()

    appending_lock = threading.Lock()
    proxies = [...list of proxies...]
    working_proxies = []

    queue = queue.Queue()

    main(proxies, working_proxies)
    print("Elapsed Time: %s" % (time.time() - start))

我是否使用了 daemon 属性错误,或者我应该设置其他参数以确保线程停止?

【问题讨论】:

  • 投票关闭,因为实际问题是逻辑错误,而不是对守护线程的误解。

标签: python multithreading proxy urllib


【解决方案1】:

在浏览了文档和其他一些资源之后,我发现线程确实关闭了,但是 queue.join() 函数在队列被清空之前一直处于阻塞状态。如果线程在完成队列中的所有项目之前被终止,则不会发生这种情况,因此脚本继续运行。

所以,我已经覆盖了 queue.join(),看起来像这样:

queue = queue.Queue()

def waiter(queue):
    while not queue.empty() and dead == False:
        pass

queue.join = waiter

如果确定满足关闭条件,则在线程中访问“死”变量。在上面的代码中,将在 run() 函数的 while 循环中放置 'dead' 而不是 'len(self.working_proxies)

另外,'dead' 是一个全局变量,所以不需要传入新的 waiter() 函数。

我确信有一种更优雅的方法可以解决这个问题,但同时这个方法应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多