2009-09-21 95 views
3

我遇到了几个使用线程模块(使用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) 

回答

7

pydoc

Thread.start()

启动线程的活动。

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

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

认为蟒蛇Thread对象的方式是,他们采取的是同步写入Python代码(无论是在run方法或通过target参数),并在知道C代码包起来如何某些块使其异步运行。这样做的好处在于,你可以像不透明的方法那样对待start:除非你用C重写课程,否则你没有任何业务覆盖它,但是你可以非常具体地处理run。例如,如果您想要同步测试线程的逻辑,这会很有用。您所需要的只是拨打t.run(),它将像其他任何方法一样执行。

+0

感谢您的好答案,我没有看到文档。 – alfredodeza 2009-09-21 17:17:08

4

方法的run()是由“threading.Thread”(谷歌继承和多态的概念OOP)的所谓的幕后。调用将在t.start()调用后立即完成。

如果您有权访问threading.py(在python文件夹中找到它)。你会看到一个类名Thread。在那个类中,有一个叫做“start()”的方法。 start()称为'_start_new_thread(self。_ _ bootstrap,())'一个低级线程启动,它将运行一个叫做'_ _ bootstrap()'的包装方法。 '_ _ bootstrap()',然后叫做'_ _ bootstrap_inner()',在做更多准备之前,最后调用'run()'。

阅读本文,您可以学到很多东西。 :d

+0

+1这很神奇。如果您要使用线程,请尝试使用PyQt线程,因为它们更加优化并允许信号/插槽跨线程进行通信。 – Chazadanga 2009-09-21 15:06:17

0

t.start()会在操作系统一个新的线程,当该线程开始它会调用线程的run()方法(或不同的功能,如果你在Thread构造提供target