0

終了時に共有整数を減らす必要があるいくつかのワーカープロセスがあります。

Threadsafetyを確保するためにロックを試みましたが、どういうわけか機能していません。プログラムの最後にワーカーを出力しても4が出力されます

http://www.laurentluce.com/posts/python-threads-synchronization-locks-rlocks-semaphores-conditions-events-and-queues/を読みました

workers = 4
lock = threading.Lock()

def workerStopped(id,lock):
    lock.acquire()
    global workers
    print "Decrease workers (" + str(workers) + ")for #" + str(id)
    workers = workers - 1
    print "Now " + str(workers) + " Workers"
    lock.release()

class Worker(Process):
    def __init__(self, queue,ident,lock):
        super(Worker, self).__init__()

        self.queue= queue
        self.idstr= str(ident)
        self.lock = lock
        print "Ident" + self.idstr
  ......

workerStopped(self.idstr,self.lock)

 ....

for i in range(4):
    Worker( request_queue,i,lock ).start()
4

1 に答える 1

0

mtadd に感謝します。彼はhttp://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing/へのリンクを提供しました。

スレッド間で共有するのではなく、別の方法で異なるプロセス間で変数を共有する必要があるようです

import time
from multiprocessing import Process, Value, Lock

def func(val, lock):
    for i in range(50):
        time.sleep(0.01)
        with lock:
            val.value += 1

if __name__ == '__main__':
    v = Value('i', 0)
    lock = Lock()
    procs = [Process(target=func, args=(v, lock)) for i in range(10)]

    for p in procs: p.start()
    for p in procs: p.join()

    print v.value
于 2013-06-26T14:39:34.907 に答える