2017-02-02 17 views
0

私はPythonとスレッドを初めて使用しています。私は一度に複数のスレッドを実行しようとしています。スレッドはPythonスクリプトでは並行して実行されていません

import threading 
    import time 
    threads = [] 

    print "hello" 

    class myThread(threading.Thread): 
      def __init__(self,i): 
        threading.Thread.__init__(self) 
        print "i = ",i 
        for j in range(0,i): 
          print "j = ",j 
          time.sleep(5) 

    for i in range(1,4): 
      thread = myThread(i) 
      thread.start() 

1つのスレッドがtime.sleep(5)を待っている間、私は別のスレッドを開始する:ここに私の基本的なコードです。要するに、すべてのスレッドは並列に実行する必要があります。ここで

+0

Afaik、Pythonのスレッドはすべて**単一コア**で動作します。だからスレッドができる唯一のことは、CPUのバーストを増やすことです。単一のコア以上を取得するために新しいプロセスを開始する 'マルチプロセッシング'ライブラリが必要です。 –

+0

スレッドスレッドが構築されるとき、それは同じスレッド上にあります。あなたのコードをconcurentlyに実行させたいなら、コンストラクタではなく 'run'メソッドに' time.sleep 'を入れてください。 – n00dl3

+0

'threading'の使い方については、[この回答](http://stackoverflow.com/a/18963931/4124317)を参照してください。基本的に 'Thread'をサブクラス化する必要はありませんが、そうした場合、スレッド化すべきタスクを実行するために' __init __() 'コンストラクタを使わないでください。 – ImportanceOfBeingErnest

答えて

2

あなたが最初にすべての__init__()方法の、threading.Threadをサブクラス化する方法についていくつかの誤解があるかもしれないコンストラクタを表し大体何である Pythonでは、基本的にインスタンスを作成するたびに実行されるため、thread = myThread(i)が実行されると、__init__()の最後までブロックされます。

start()が呼び出されたときに、スレッドが実行を開始するように、あなたは、run()にあなたの活動を移動する必要があります。例:

import threading 
import time 
threads = [] 

print "hello" 

class myThread(threading.Thread): 
    def __init__(self, i): 
     threading.Thread.__init__(self) 
     self.i = i 

    def run(self): 
     print "i = ", self.i 
     for j in range(0, self.i): 
      print "j = ",j 
      time.sleep(5) 

for i in range(1,4): 
    thread = myThread(i) 
    thread.start() 

P.S. CPythonにGILが存在するため、タスクがCPUにバインドされている場合、すべてのプロセッサを十分に活用できない場合があります。

+0

それは働いて、私は最終的にそれがどのように動作しているか理解しています。ありがとう、トン。 –

1

はあなたのコードに基づいて、スレッドを使用することができます方法の例です:

import threading 
import time 
threads = [] 

print "hello" 

def doWork(i): 
    print "i = ",i 
    for j in range(0,i): 
     print "j = ",j 
     time.sleep(5) 

for i in range(1,4): 
    thread = threading.Thread(target=doWork, args=(i,)) 
    threads.append(thread) 
    thread.start() 

# you need to wait for the threads to finish 
for thread in threads: 
    thread.join() 

print "Finished" 
+0

それは働いた。あなたの助けをありがとう –

関連する問題