我已经遇到了一些使用线程模块管理线程的例子(使用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)
答案 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
,则调用另一个函数构造函数)