gpt4 book ai didi

python - 在 Python 线程/队列方面需要一些帮助

转载 作者:太空狗 更新时间:2023-10-29 22:17:06 24 4
gpt4 key购买 nike

import threading
import Queue
import urllib2
import time

class ThreadURL(threading.Thread):

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

self.queue = queue

def run(self):
while True:
host = self.queue.get()
sock = urllib2.urlopen(host)
data = sock.read()

self.queue.task_done()

hosts = ['http://www.google.com', 'http://www.yahoo.com', 'http://www.facebook.com', 'http://stackoverflow.com']
start = time.time()

def main():
queue = Queue.Queue()

for i in range(len(hosts)):
t = ThreadURL(queue)
t.start()

for host in hosts:
queue.put(host)

queue.join()

if __name__ == '__main__':
main()
print 'Elapsed time: {0}'.format(time.time() - start)

我一直在努力了解如何执行线程处理,在学习了一些教程之后,我想出了以上内容。

它应该做的是:

  1. 初始化队列
  2. 创建我的线程池,然后对主机列表进行排队
  3. 一旦主机进入队列并读取网站数据,我的 ThreadURL 类就会开始工作
  4. 程序应该完成

我首先想知道的是,我这样做是否正确?这是处理线程的最佳方式吗?

其次,我的程序无法退出。它打印出 Elapsed time 行,然后卡在那里。我必须杀死我的终端才能让它消失。我假设这是由于我错误地使用了 queue.join() 造成的?

最佳答案

您的代码看起来不错而且很干净。

您的应用程序仍然“挂起”的原因是工作线程仍在运行,等待主应用程序将某些内容放入队列,即使您的主线程已完成。

解决此问题的最简单方法是将线程标记为守护进程,方法是在调用开始之前执行 t.daemon = True。这样,线程将不会阻止程序停止。

关于python - 在 Python 线程/队列方面需要一些帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4131069/

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