3

threading モジュール (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()

スレッドのアクティビティを開始します。

スレッド オブジェクトごとに最大 1 回呼び出す必要があります。オブジェクトの run() メソッドが別の制御スレッドで呼び出されるように調整します。

このメソッドは、同じスレッド オブジェクトで複数回呼び出されると、RuntimeException を発生させます。

Pythonオブジェクトは、同期的に (メソッド内または引数を介して)Thread記述された Python コードの一部を取り、それを非同期で実行する方法を知っている C コードでラップするというものです。この利点は、不透明なメソッドのように扱えることです。C でクラスを書き直さない限り、メソッドをオーバーライドする必要はありませんが、非常に具体的に扱うことができます。これは、たとえば、スレッドのロジックを同期的にテストする場合に役立ちます。呼び出すだけで、他のメソッドと同じように実行されます。runtargetstartrunt.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()OS に新しいスレッドを作成し、このスレッドが開始されると、スレッドのメソッド (またはコンストラクターで を指定したrun()場合は別の関数) を呼び出します。targetThread

于 2009-09-21T15:04:43.080 に答える