3

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

我想了解的是这个例子如何调用“运行”方法以及在哪里。我在任何地方都看不到它。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)
4

3 回答 3

7

根据pydoc

Thread.start()

启动线程的活动。

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

如果在同一个线程对象上多次调用此方法,则会引发 RuntimeException。

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

于 2009-09-21T15:11:17.550 回答
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

于 2009-09-21T15:00:47.923 回答
0

t.start()在操作系统中创建一个新线程,当这个线程开始时,它将调用线程的方法(或者如果你在构造函数中run()提供了一个不同的函数)targetThread

于 2009-09-21T15:04:43.080 回答