Переменные класса и Threading - неожиданное поведение - PullRequest
2 голосов
/ 27 августа 2011

Я столкнулся с неожиданным поведением при работе с потоками. Я приложил короткий пример ниже, чтобы продемонстрировать поведение:

from multiprocessing import Process, Lock
import time

class inc:

    def __init__(self):
        print "Initializing a new class"
        self.value = 0

    def add_one(self):
        self.value += 1
        print self.value

def f(a,l):
    # Do something using a class call
    l.acquire()
    a.add_one()
    l.release()
    #Do something that takes a long time
    time.sleep(5)
    #Do a different thing using a class call
    l.acquire()
    a.add_one()
    l.release()

if __name__=="__main__":
    a=inc()
    lock = Lock()

    for i in range(0,4):
        Process(target=f, args=(a,lock)).start()

Вывод, который я ищу, 1,2,3,4,5,6,7,8, но я получаю: 1,1,1,1,2,2,2,2. Я правильно использую блокировку потоков? Существует только один экземпляр класса, и я сериализирую поток доступа к классу, так почему же переменная класса не увеличивается?

1 Ответ

3 голосов
/ 27 августа 2011

Вы не используете «блокировку потока», вы используете блокировку процесса.Поскольку процессы не разделяют содержимое кучи, каждый раз f получает разные объекты.

См. threading - библиотека Python для операций с потоками.Это позволяет вам достичь необходимого поведения.

Возможно, просто замените

from multiprocessing import Process, Lock
...
    Process(target=f, args=(a,lock)).start()

на

from threading import Thread, Lock
...
    Thread(target=f, args=(a,lock)).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...