当前位置: 首页 > 面试题库 >

在Python中正确使用互斥锁

越涛
2023-03-14
问题内容

我从python中的多线程开始(或者至少我的脚本有可能创建多个线程)。该算法是否是Mutex的正确用法?我尚未测试此代码,它可能甚至无法正常工作。我只希望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的Mutex而不是Python的Mutex。使用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
),无论如何一次您实际上只能运行一个线程-
如果其中许多线程受I / O约束,这很好,尽管您会想要释放尽可能多的锁,以便I / O绑定线程不会阻止其他线程运行。

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


 类似资料:
  • 问题内容: 我试图了解互斥的工作原理。到目前为止,据我了解,它可以进行原子操作并同步对某些数据的访问。 我在这里构建了一个队列数据结构的示例:https : //github.com/arnauddri/algorithms/blob/master/data- structures%2Fqueue%2Fqueue.go 这是一些代码: 但是,当我尝试创建队列并将项目推送到该队列时,出现运行时错误:

  • 问题内容: 如果我正确使用通道,是否需要使用互斥锁来防止并发访问? 问题答案: 如果正确使用通道,则不需要互斥。在某些情况下,使用互斥锁的解决方案可能会更简单。 只需确保包含通道值的变量已正确初始化,然后使用多个goroutine尝试访问通道变量即可。一旦完成,按设计访问通道(例如,向它们发送值或从中接收值)是安全的。 带有参考文献的证明文件(重点由我添加): 规格:渠道类型: 单个信道 ,可以使

  • 问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为

  • 问题内容: 我需要的是: 我尝试了这个,但是没有用。有人可以帮我吗? 谢谢! 问题答案: 不会使整个组互斥。它使组内的选项互斥。 您正在寻找的是子命令。而不是编[-a xxxx | [-b yyy -c zzz]],您将拥有: 要使用第一组参数进行调用: 要使用第二组参数进行调用: 您还可以将子命令参数设置为位置。 有点像git或svn: 工作范例 测试一下 祝好运。

  • 我已经编写了3个互斥类TMutex、TCondition和TSpinLock,它们都有一个void lock()和一个void unlock()成员。现在我想对它们使用std::lock\u-guard。我在源文件末尾为我的新互斥类安装了lock_guard,如下所示: 如果我使用: 我收到以下编译器错误消息: .../src/inc/threads.cpp:317: 39:错误:没有匹配函数调用

  • Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor