私は、ここにいる誰かが私を助けてくれることを望んでいるという単純な問題があります。 forループを介して一連のスレッドとして呼び出される関数があります。配列出力はQueue
に格納され、メインプログラムで取得されます。スレッドは完璧に機能しますが、残念ながらデータの配列は呼び出された順序とは異なる順序で返されます。私はこの疑問に疑似コードの例を取り上げています。スレッドが作成されて並列に実行されるが、作成された順に返されるスレッドロックメカニズムがあるかどうか。スレッドが作成された順に返されるようにする
import numpy as np
from multiprocessing import Process, Queue
def Thread_Func(container1,container2,container3,iterable,more_parameters, \
Thread):
Array1 = np.array([]); Array2 = np.array([])
for i in range(len(iterable)):
Array1 = np.append(some_operation)
Array2 = np.append(some_other_operation)
container1.put(Array1)
container2.put(Array2)
container3.put(Thread)
if __name__ == "__main__":
container1 = Queue()
container2 = Queue()
container3 = Queue()
Thread = 1
for index in range(Number_of_Threads):
p = Process(target=Thread_Func,args=(container1,container2,container3, \
iterable,more_parameters))
Thread = Thread + 1
p.daemon = True
p.start()
Array1 = np.array([])
Array2 = np.array([])
Thread_Array = np.array([])
for index in range(Number_of_Threads)
Array1 = np.append(Array1,container1.get())
Array2 = np.append(Array2,container2.get())
Thread_Array = np.append(Thread_Array,container3.get())
p.join()
print (Array1)
print (Array2)
print (Thread_Array)
それはスレッドが順不同で返されたArray1
のプリントアウトを見た後にかなり明白ですが、私は2つのスレッドを実行した後Thread_Array
を見たとき、私は[1. 2.]
を見るべきであるとき、私は、[2. 1.]
を参照してください。スレッドが正しい順序で返されるようにするためにできることはありますか?
スレッドNUMの順序はここで重要なのはなぜ?私は、最初のスレッドの実行が非常に長く、他のスレッドがそれを待たなければならないと仮定すると、シングルスレッドの方法に戻ってくるかもしれないので、そうは思わない...スレッドnumリストの並べ替えはどうですか? – linpingta
実際に。 'numpy'は方程式から完全に削除することができ、例はずっと簡単になります。プロセス作成で 'スレッド 'が渡されないのはなぜですか? –
そして、これをしようとしている理由を説明してください。 – Soviut