2017-01-03 9 views
2

私は2つのスレッドを同期したい私はこれを行うことができますどのように、私はロックまたは結合方法を使用しPythonスレッドを同期するには?リストから1つの添付、別のpoping:

import threading 


class Pop(threading.Thread): 
    def __init__(self, name, alist): 
     threading.Thread.__init__(self) 
     self.alist = alist 
     self.name = name 

    def run(self): 
     print "Starting " + self.name 
     self.pop_from_alist(self.alist) 
     print "Exiting " + self.name 

    def pop_from_alist(self, alist): 
     alist.pop(0) 


def main(): 
    alist = [1, 2] 
    # Create new thread 
    thread = Pop("Pop thread", alist) 
    for x in range(2): 
     alist.append(alist[-1]+1) 
    thread.start() 
    print "Exiting Main Thread" 
    print alist 
main() 

使用する必要がありますか? 初心者向けの同期チュートリアルを見つける

+0

[Python Queues](https://docs.python.org/2/library/queue.html)を参照してください。完全な回答が必要な場合はお知らせください。 –

答えて

2

両方のスレッドが同じロックを共有する必要があります。この方法で、他のスレッドがロックしたことを知ることができます。あなたは、あなたのメインスレッドでロックを定義し、初期化時に自分のスレッドにそれを渡す必要があります。

# Create a lock 
lock = threading.Lock() 

# Create new threads 
thread1 = Append("Append thread", alist, lock) 
thread2 = Pop("Pop thread", alist, lock) 

# Start new Threads 
thread1.start() 
thread2.start() 

あなたはそれをあなたがすでに行った方法を扱うが、ロックの作成を省略することができますスレッド内:

class Append(threading.Thread): 
    def __init__(self, name, alist, lock): 
     threading.Thread.__init__(self) 
     self.alist = alist 
     self.name = name 
     self.lock = lock 

def append_to_list(self, alist, counter): 
    while counter: 
     with self.lock: 
      alist.append(alist[-1]+1) 
      counter -= 1 
+0

lock.acquireとrelease()を使用する必要はありませんか? – Alexey

+1

@AlexeyUstinnikov: 'with' enter/exitシーケンスは、エントリ時にロックを取得し、終了時にロックを解放します。これは、ロックを保持している間に操作を実行する非常に良い方法です。例外またはキーボード割り込みでもロックが解除されることを保証します。 – torek

関連する問題