线程中的流量控制。线程

时间:2009-09-21 14:56:40

标签: python multithreading control-flow

我已经遇到了一些使用线程模块管理线程的例子(使用Python 2.6)。

我想要了解的是这个例子如何调用“run”方法以及在哪里。我什么都看不到。 ThreadUrl类在main()函数中实例化为“t”,这是我通常希望代码启动“run”方法的地方。

也许这不是使用线程的首选方式?请赐教:

#!/usr/bin/env python

import Queue
import time
import urllib2
import threading
import datetime

hosts = ["http://example.com/", "http://www.google.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(10)

                    #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(1):
            t = ThreadUrl(queue)
            t.setDaemon(True)
            t.start()

            for host in hosts:
                    queue.put(host)

    queue.join()
main()
print "Elapsed time: %s" % (time.time() - start)

3 个答案:

答案 0 :(得分:7)

根据pydoc

  

Thread.start()

     

开始线程的活动。

     

每个线程对象最多只能调用一次。它安排了   object中要调用的run()方法   一个单独的控制线程。

     

如果调用超过,则此方法将引发RuntimeException   曾经在同一个线程对象上。

思考python Thread对象的方法是它们采用一些同步编写的python代码(在run方法中或通过target参数)并包装它在C代码中知道如何使它以异步方式运行。这样做的好处就是你可以像对待一个不透明的方法一样对待start:除非你用C语言重写这个类,否则你没有任何业务覆盖它,但是你可以非常对待run具体。例如,如果要同步测试线程的逻辑,这可能很有用。您所需要的只是调用t.run(),它将像任何其他方法一样执行。

答案 1 :(得分:4)

方法run()在场景后面通过“threading.Thread”(Google继承和OOP的多态概念)调用。调用将在t.start()调用后立即完成。

如果您可以访问threading.py(在python文件夹中找到它)。您将看到一个类名称Thread。在该类中,有一个名为“start()”的方法。 start()名为'_start_new_thread(self .__ bootstrap,())'一个低级线程启动,它将运行一个新线程称为'__bootstrap()'的包装器方法。然后,'__ bootstrap()',称为'__bootstrap_inner()'之前做了一些准备,最后调用'run()'。

阅读源代码,你可以学到很多东西。 :d

答案 2 :(得分:0)

t.start()在操作系统中创建一个新线程,当此线程开始时,它将调用线程的run()方法(如果在{{1中提供target,则调用另一个函数构造函数)