我从 python 中的多线程开始(或者至少我的脚本可能创建多个线程)。这个算法是互斥体的正确用法吗?我还没有测试过这段代码,它可能根本无法工作。我只希望 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
编辑:重新阅读我的代码,我发现它是完全错误的。但是嘿,这就是我来这里寻求帮助的原因。
我不知道你为什么使用 Window 的互斥体而不是 Python 的互斥体。使用 Python 方法,这非常简单:
from threading import Thread, Lock
mutex = Lock()
def processData(data):
with mutex:
print('Do some stuff')
while True:
t = Thread(target = processData, args = (some_data,))
t.start()
但请注意,由于 CPython 的架构(即全局解释器锁)无论如何,你实际上一次只会运行一个线程——如果其中许多线程是 I/O 绑定的,那么这很好,尽管你会希望尽可能多地释放锁,以便 I/O 绑定线程不会阻止其他线程运行。
对于 Python 2.6 及更高版本,另一种选择是使用 Pythonmultiprocessing
包裹。它反映了threading
包,但会创建全新的流程can同时运行。更新您的示例很简单:
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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)