Я запускаю с мультипотоков в 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 видит, что это чрезвычайно неправильно. но эй, вот почему я здесь обращаюсь за помощью.
Я не знаю, почему вы используете 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()
Вот решение, к которому я пришел:
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
Когда-нибудь вам придется разблокировать свой мьютекс ...