2013-06-26 2 views
0

У меня есть несколько рабочих процессов, которые должны уменьшить общее целое число, когда они закончены.Python Threadsafe Integer Уменьшение с помощью блокировок

Для обеспечения 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() 
+1

Просьба дать более подробное описание, чем «как-то не работает». Обратите внимание, что ваш образец кода не является автономным, поэтому мы не можем его запустить и сами убедиться, в чем проблема. – user4815162342

+0

См. [Разница между потоком и процессом] (http://stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread), а также [общий счетчик с python multiprocessing] (http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing/) – mtadd

+0

работники в конце еще 4;) также он всегда печатается как 3 после вызова рабочий остановился – Dukeatcoding

ответ

0

Thx к 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