我想在python中使用线程下载大量网页,并通过以下代码在网站之一中使用队列。
它放置了一个无限的while循环。是否每个线程都连续运行,直到所有线程完成才结束?我错过了什么吗?
#!/usr/bin/env python
import Queue
import threading
import urllib2
import time
hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com",
"http://ibm.com", "http://apple.com"]
queue = Queue.Queue()
class ThreadUrl(threading.Thread):
"""Threaded Url Grab"""
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
#grabs host from queue
host = self.queue.get()
#grabs urls of hosts and prints first 1024 bytes of page
url = urllib2.urlopen(host)
print url.read(1024)
#signals to queue job is done
self.queue.task_done()
start = time.time()
def main():
#spawn a pool of threads, and pass them queue instance
for i in range(5):
t = ThreadUrl(queue)
t.setDaemon(True)
t.start()
#populate queue with data
for host in hosts:
queue.put(host)
#wait on the queue until everything has been processed
queue.join()
main()
print "Elapsed Time: %s" % (time.time() - start)
将线程设置为daemon
线程会使线程在主线程完成后退出。但是,是的,您是正确的,只要线程中的某些queue
内容将阻塞,线程将连续运行。
该文档解释了此详细信息Queue docs
python Threading文档也对此daemon
部分进行了说明。
当没有活动的非守护线程时,整个Python程序将退出。
因此,当队列为空并且queue.join
解释器退出时恢复运行时,线程将死亡。
编辑:的默认行为的更正 Queue
如果正在运行的线程少于corePoolSize线程,则执行器宁愿添加一个新线程,而不是排队。2)如果corePoolSize或更多线程正在运行,则执行器更喜欢将请求排队,而不是添加新线程。 如果请求无法排队,将创建一个新线程,除非该线程将超过maximumPoolSize,在这种情况下,任务将被拒绝。 第一种情况是可以的,但我想要的是,当核心线程被利用时,任务不需要排队(即使在有界队列的情况下,比
默认情况下,C++容器应该是线程安全的。我必须错误地使用多线程,因为对于此代码: 我得到了:
本文向大家介绍在Python中使用多线程进行套接字编程?,包括了在Python中使用多线程进行套接字编程?的使用技巧和注意事项,需要的朋友参考一下 多线程概念 多线程是几乎所有现代编程语言(尤其是python)的核心概念,因为它的线程实现简单。 线程是程序内的子程序,可以独立于代码的其他部分执行。线程在同一上下文中执行,以共享程序的可运行资源(如内存)。 当在一个进程中,我们同时执行多个线程时,称
本文向大家介绍python程序 线程队列queue使用方法解析,包括了python程序 线程队列queue使用方法解析的使用技巧和注意事项,需要的朋友参考一下 一、线程队列 queue队列:使用方法同进程的Queue一样 如果必须在多个线程之间安全地交换信息时,队列在线程编程中尤其有用。 重要: q.put() :往队列里面放值,当参数block=Ture的时候,timeout参数将会有作用,当队
我需要一个库或我们的软件工具,可以: 1)将线程/作业/任务(任何东西--如果需要,我们可以重写代码,我们在mintue有线程对象)放入像system这样的队列中2)我们可以定义同时最多运行多少线程3)线程完成后,线程从队列中移除,这样GC就可以移除所有涉及的实体。 我正在进行大量阅读,发现ExecutorService(Executors.newFixedThreadPool(5);)但问题可能
在使用TensorFlow进行异步计算时,队列是一种强大的机制。 正如TensorFlow中的其他组件一样,队列就是TensorFlow图中的节点。这是一种有状态的节点,就像变量一样:其他节点可以修改它的内容。具体来说,其他节点可以把新元素插入到队列后端(rear),也可以把队列前端(front)的元素删除。 为了感受一下队列,让我们来看一个简单的例子。我们先创建一个“先入先出”的队列(FIFOQ