2017-08-27 20 views
1

ここにpythonコードスニペットがあります。ここで_MainThreadは、thread.run()に対して何を意味していますか?

import threading 

class myThread(threading.Thread): 
     def __init__(self, threadID, name, counter): 
       threading.Thread.__init__(self) 
       self.threadID = threadID 
       self.name = name 
       self.counter = counter 

     def run(self): 
       currentTreadname = threading.currentThread() 
       print "running in", currentTreadname 

レッツ・インスタンスクラスmyThread

thread = myThread(1,"mythrd",1) 

そしてそれで実行メソッドを呼び出します。

thread.run() 
running in <_MainThread(MainThread, started 139982993762048)> 

ここで、_MainThreadは、thread.run()に対して何を意味していますか?スレッドの取扱説明書では :

The standard run() method invokes the callable object passed to the object’s constructor as the target argument. 

1.Hereは、私の例では、二つのオブジェクトですが、最初の呼び出し可能オブジェクトは、_MainThreadを意味しますか?
to the object’s constructorの2番目のオブジェクトは、myThreadのコンストラクタを意味するのですか?
2. sonクラスのrunメソッドは親クラスを呼び出すことができますか?

thread.run() 
running in <_MainThread(MainThread, started 139982993762048)> 

スレッドは、息子のクラスのインスタンスである - myThread(1、 "mythrd" は、1)、なぜthread.run()_MainThreadを取り消しますか?

答えて

1

Thread.start()メソッドを呼び出す必要があります。

import threading 

class myThread(threading.Thread): 
    def __init__(self,threadID, name, counter): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self):                                            
     currentTreadname = threading.currentThread() 
     print "running in", currentTreadname 

thread = myThread(1, "mythread", 1) 
thread.start() 

出力は次のようになります。

running in <myThread(mythread, started 140140930873088)> 

開始()

スタートスレッドの活動。

スレッドオブジェクトごとに最大で1回呼び出す必要があります。これは、オブジェクトのrun()メソッドが独立した制御スレッド内で呼び出されるように手配します。

実行()スレッドの活動を表す

方法。

サブクラスでこのメソッドをオーバーライドできます。標準のrun()メソッドは、オブジェクトのコンストラクタに渡された呼び出し可能オブジェクトを、argsおよびkwargs引数からそれぞれ取得されたシーケンシャルおよびキーワード引数を使用してターゲット引数として呼び出します。

したがって、start()メソッドはスレッドのアクティビティを開始します。はい、このアクティビティはrun()メソッドです。

更新が標準run()メソッドは、ターゲットの引数としてオブジェクトのコンストラクタに渡された呼び出し可能オブジェクトを呼び出します。

2番目のオブジェクトは、myThreadインスタンスです。そうです。しかし、呼び出し可能なオブジェクトはあなたが言ったことではありません。このスレッドをチェックしてください。スレッド定義:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) 

ターゲットはrun()メソッドによって呼び出される呼び出し可能オブジェクトです。デフォルトはNoneで、何も呼び出されないことを意味します。

呼び出し可能オブジェクトは、渡すターゲットパラメータです。これについて詳しくは、https://docs.python.org/2/library/threading.html

running in <_MainThread(MainThread, started 139982993762048)>と表示されるのはなぜですか?

Thread.startメソッドを呼び出さないため、新しいスレッドが開始されないためです。したがって、myThread.runを呼び出すだけであれば、これは通常のオブジェクトメソッド呼び出しです。 mainThreadで呼び出されます。それで、これが印刷されます。

+0

標準run()メソッドのように、オブジェクトのコンストラクタに渡された呼び出し可能オブジェクトを呼び出します私の例では2つのオブジェクトがあり、最初の呼び出し可能オブジェクトは '_MainThread'を意味しますか?オブジェクトのコンストラクタへの2番目のオブジェクトは、 'myThread'を意味しますか、そうではありませんか? – scrapy

+0

回答が更新されました。 – GuangshengZuo

0

私はあなたが正しくスレッドを使用したい場合は、上記のように、あなたがGuangshengZuo答えに従うべきだと思う、私はあなたが探していた答えを提供しようとした:
_MainThreadはthreadingモジュールでクラスです。私が行ったようにあなたは簡単に以下である変数currentTreadnameの種類を確認することができます。

class myThread(threading.Thread): 
    def __init__(self, threadID, name, counter): 
      threading.Thread.__init__(self) 
      self.threadID = threadID 
      self.name = name 
      self.counter = counter 

    def run(self): 
      currentTreadname = threading.currentThread() 
      print("running in", type(currentTreadname)) 
thread = myThread(1,"mythrd",1) 
thread.run() 

出力:

running in <class 'threading._MainThread'> 
+0

おそらく特殊な種類のダミースレッド(Pythonで作成されていないスレッド)です。スレッドがCライブラリによって作成され、その後Pythonにコールバックされる場合、追加のダミースレッドを作成できます。 'threading._DummyThread'型になります。 – o11c

関連する問題