0

Pythonキューに関して疑問があります。

run()メソッドがキューを実行するスレッドクラスを作成しました。

  import threading
  import Queue

  def AThread(threading.Thread):
     def __init__(self,arg1):
         self.file_resource=arg1
         threading.Thread.__init__(self)
         self.queue=Queue.Queue()

     def __myTask(self):
         self.file_resource.write()
         ''' Method that will access a common resource
          Needs to be synchronized.
          Returns a Boolean based on the outcome
         '''

     def run():
         while True:
             cmd=self.queue.get()
             #cmd is actually a call to method
             exec("self.__"+cmd)
             self.queue.task_done()


 #The problem i have here is while invoking the thread
 a=AThread()
 a.queue.put("myTask()")
 print "Hai"

AThreadの同じインスタンス(a = AThread())は、異なる場所からキューにタスクをロードします。

したがって、下部のprintステートメントは、上記のステートメントを介してキューに追加されたタスクを待機し、最終的な期間を待機し、タスクの実行後に返された値も受け取る必要があります。

これを達成するための単純な方法はありますか?私はこれに関してたくさん検索しました、親切にこのコードを見直して、提案を提供してください。

そして、なぜpythonのacquireとreleaseロックがクラスのインスタンスにないのか。上記のシナリオでは、AThreadのインスタンスaとbを同期する必要はありませんが、取得ロックと解放ロックが適用されると、myTaskはaとbの両方のインスタンスに対して同期して実行されます。

親切に提案を提供してください。

4

1 に答える 1

0

問題の特定の輪郭に応じて、取るべきアプローチはたくさんあります。

myTask の完了後に発生する必要がある場合print "Hai"は、それをタスクに入れ、終了時に myTask にそのタスクをキューに入れることができます。(あなたが CS 理論のような人なら、これは継続渡しスタイルに似ていると考えることができます)。

print "Hai"複数のタスクに対してより複雑な依存関係がある場合は、先物や約束を調べることができます。

アクターベースの同時実行の世界に足を踏み入れることができます。その場合、多かれ少なかれ必要なことを行う同期メッセージ送信メソッドがおそらく存在するでしょう。

先物や約束を使用したくない場合は、条件変数を導入することで、同様のことを手動で実現できます。myTask が開始する前に条件変数を設定して myTask に渡し、クリアされるのを待ちます。プログラムが成長するにつれて非常に注意し、ロック戦略を常に再考して、単純でわかりやすいものに保つ必要があります。これは、困難な同時実行バグの原因です。

必要なものを取得するための最も賢明なステップは、おそらく、条件変数の処理を行う Queue.put() のブロッキング バージョンを提供することです。キューが空になるまでブロックするか、キューに置いたものがキューから削除されるまでブロックするか、またはキューに置いたものが処理を完了するまでブロックするかを必ず検討してください。そして、考えていたときに実装することにしたことを必ず実装してください。

于 2012-08-03T06:19:05.490 に答える