Надлежащее использование взаимных исключений в Python

Я запускаю с мультипотоков в Python (или по крайней мере возможно, что мой сценарий создает несколько потоков). этот алгоритм был бы правильным использованием Взаимного исключения? Я еще не протестировал этот код, и он, вероятно, не будет даже работать. Я просто хочу, чтобы processData работал в потоке (один во время) и основной цикл с условием продолжения для продолжания бежать, даже если существует поток в очереди.

from threading import Thread
from win32event import CreateMutex
mutex = CreateMutex(None, False, "My Crazy Mutex")
while(1)
    t = Thread(target=self.processData, args=(some_data,))
    t.start()
    mutex.lock()

def processData(self, data)
    while(1)
        if mutex.test() == False:
            do some stuff
            break

Править: перечитывание моего кода I видит, что это чрезвычайно неправильно. но эй, вот почему я здесь обращаюсь за помощью.

67
задан David Sykes 21 January 2011 в 10:52
поделиться

3 ответа

Я не знаю, почему вы используете Window Mutex вместо Python. Используя методы Python, это довольно просто:

from threading import Thread, Lock

mutex = Lock()

def processData(data):
    mutex.acquire()
    try:
        print('Do some stuff')
    finally:
        mutex.release()

while True:
    t = Thread(target = processData, args = (some_data,))
    t.start()

Но учтите, что из-за архитектуры CPython (а именно Global Interpreter Lock ) вы в любом случае эффективно будете иметь только один поток, работающий одновременно - это нормально, если некоторые из них связаны с вводом-выводом, хотя вы захотите снять блокировку насколько это возможно, чтобы связанный поток ввода-вывода не блокировал выполнение других потоков.

Альтернативой для Python 2.6 и новее является использование пакета Python multiprocessing . Он отражает пакет threading , но создает совершенно новые процессы, которые могут запускаться одновременно. Обновить ваш пример тривиально:

from multiprocessing import Process, Lock

mutex = Lock()

def processData(data):
    with mutex:
        print('Do some stuff')

if __name__ == '__main__':
    while True:
        p = Process(target = processData, args = (some_data,))
        p.start()
142
ответ дан 24 November 2019 в 14:30
поделиться

Вот решение, к которому я пришел:

import time
from threading import Thread
from threading import Lock

def myfunc(i, mutex):
    mutex.acquire(1)
    time.sleep(1)
    print "Thread: %d" %i
    mutex.release()


mutex = Lock()
for i in range(0,10):
    t = Thread(target=myfunc, args=(i,mutex))
    t.start()
    print "main loop %d" %i

Output:

main loop 0
main loop 1
main loop 2
main loop 3
main loop 4
main loop 5
main loop 6
main loop 7
main loop 8
main loop 9
Thread: 0
Thread: 1
Thread: 2
Thread: 3
Thread: 4
Thread: 5
Thread: 6
Thread: 7
Thread: 8
Thread: 9
13
ответ дан 24 November 2019 в 14:30
поделиться

Когда-нибудь вам придется разблокировать свой мьютекс ...

8
ответ дан 24 November 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: