在Python中正确使用互斥

我开始在Python中的multithreading(或者至less有可能是我的脚本创build多个线程)。 这个algorithm会是一个互斥量的正确用法吗? 我还没有testing这个代码,它可能不会工作。 我只想让processData在一个线程(一次一个)中运行,并且主要的while循环继续运行,即使队列中有一个线程。

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 

编辑:重新读我的代码我可以看到,这是非常错误的。 但是,嘿,这就是为什么我在这里寻求帮助。

我不知道你为什么使用窗口的互斥,而不是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(即全局解释器锁 )的架构,实际上每次只能有一个线程运行 – 如果其中一些线程是I / O绑定,尽可能释放锁,使得I / O绑定线程不会阻塞其他线程的运行。

对于Python 2.6和更高版本,另一种方法是使用Python的multiprocessing包。 它反映了threading包,但会创build可以同时运行的全新的进程。 更新你的例子是微不足道的:

 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() 

这是我提出的解决scheme:

 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 

输出:

 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 

你必须在某个时候解锁你的互斥体