Как сделать так, чтобы общие переменные были поточно-ориентированными? - PullRequest
1 голос
/ 01 декабря 2011

У меня похожая проблема:

DemoVar = 100 #### or whatever

def DemoMultiThreadMethod(mode):
    DemoRLock.acquire()

    DemoVar = 0 #### or random value
    ...
    Other resources which do not support multi-threaded access

    if mode == 0:
        do A with DemoVar

    elif mode == 1:
        do B with DemoVar
    ...

    DemoRLock.release()

...

def DecideAfterDemo(self):
    NewThread = threading.Thread(target = DemoMultiThreadMethod, args = (RandomMode, ))
    NewThread.start()

    NewThread.join()

    Result = DemoVar

    if Result == SpecificValue:
        Do something
    else:
        Do another
    ...

...

def SpawnThreads(self): 
    #### hundreds of DecideAfterDemo running
    Counter = 0

    while Counter < 1000:
        SpawnAThread = threading.Thread(target = DecideAfterDemo, args = ())
        SpawnAThread.Start()

... 

Как я могу убедиться в безопасности запуска Result = DemoVar?

Я имею в виду, что если есть тонны заблокированных DemoMultiThreadMethod с, ожидающих обработки, вы не знаете, какие из DemoVar = 0 #### or random value и Result = DemoVar будут запускаться первыми, поскольку оба они являются атомарной операцией (правильно я, если я не прав), что означает Result = DemoVar может быть небезопасно, если в пуле слишком много потоков. Решение, которое я могу придумать, это добавить time.sleep(0.01) после DemoRLock.acquire(), чтобы убедиться, что Result = DemoVar запускается первым, но это может снизить производительность. Есть идея получше?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

То, что вы хотите, это отправить некоторое значение (DemoVar) из DemoMultiThreadMethod в DecideAfterDemo.Хотя вы можете использовать некоторую библиотеку для передачи сообщений, самый простой способ - определить класс потоков ... что-то вроде этого (не проверено):

class DemoMultiThread(threading.Thread):
     def __init__(self, mode):
         self.mode = mode
         threading.Thread.__init__(self)
     def run(run):
         mode = self.mode
         DemoRLock.acquire()
         ...
         self.result = DemoVar
         DemoRLock.release()

def DecideAfterDemo(self):
     NewThread = DemoMultiThread(mode)
     NewThread.start()
     NewThread.join()
     Result = NewThread.result
     ....
0 голосов
/ 28 ноября 2016

Теперь каждый раз, когда я пытаюсь обмениваться / обмениваться информацией с несколькими потоками, я сразу перехожу к модулю Queue, это более удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...