加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 用获取和释放信号量方法替换关键字

发布时间:2020-12-20 13:07:05 所属栏目:Python 来源:网络整理
导读:Here我发现以下示例(这是修改版本)使用多处理模块的信号量: #!/bin/env pythonimport multiprocessingfrom time import sleepimport osmax_allowed_processes_in_critical_section=1semaphore = multiprocessing.Semaphore(max_allowed_processes_in_critic
Here我发现以下示例(这是修改版本)使用多处理模块的信号量:

#!/bin/env python

import multiprocessing
from time import sleep
import os

max_allowed_processes_in_critical_section=1
semaphore = multiprocessing.Semaphore(max_allowed_processes_in_critical_section)

def do_job(id):
    # BEGINNING OF CRITICAL SECTION
    with semaphore:
        sleep(1)
        print "#####################"
        print "Inside locked semaphore"
        print "PPID: %s" % os.getppid()
        print "PID:  %s" % os.getpid()

    # END OF CRITICAL SECTION
    print("Finished job")

def main():
    pool = multiprocessing.Pool(6)
    for job_id in range(6):
        print("Starting job")
        pool.apply_async(do_job,[job_id])
    pool.close()
    pool.join()

if __name__ == "__main__":
    main()

正如您在此上下文中所看到的,信号量与关键字一起使用.通常,信号量有两种方法wait()和signal().在python的线程和多处理模块中,这些方法是AFAIK,相当于acquire()和release().我已经重写了这个代码,它使用了acquire()和release()方法:

#!/bin/env python

import multiprocessing
from time import sleep
import os

max_allowed_processes_in_critical_section=1
semaphore = multiprocessing.Semaphore(max_allowed_processes_in_critical_section)

def do_job(id):
    # BEGINNING OF CRITICAL SECTION
    semaphore.acquire()
    sleep(1)
    print "#####################"
    print "Inside locked semaphore"
    print "PPID: %s" % os.getppid()
    print "PID:  %s" % os.getpid()
    semaphore.release()

    # END OF CRITICAL SECTION
    print("Finished job")

def main():
    pool = multiprocessing.Pool(6)
    for job_id in range(6):
        print("Starting job")
        pool.apply_async(do_job,[job_id])
    pool.close()
    pool.join()

if __name__ == "__main__":
    main()

从我之前的question中我了解到,当某个方法与with关键字一起使用时,__enter __()和__exit __()上下文管理器的方法将在with语句的主体上进行调用(并分别退出).所以我假设在__enter __()中调用acquire(),在__exit __()中调用release().

问题:

>我的假设是从__enter __()和中调用acquire()
release()来自__exit __()是否正确?
>在这个例子中,我能以某种方式看到__enter __()和__exit __()方法吗?我还注意到,当我使用版本I访问未定义的变量时,我没有得到任何异常(它必须有一些异常处理,它只是简单地抑制了错误).

例如.即使ppid和pid不存在,这个也不会抛出异常

print "#####################"
print "Inside locked semaphore"
print "PPID: %s" % ppid
print "PID:  %s" % pid

>这种使用信号量的方法是否确保关键部分中一个过程的排他性是正确的?
>作为一个python初学者,我没有理解为什么BoundedSemaphore([value])和Semaphore([value])嵌套在documentation中的类multiprocessing.managers.SyncManager下你能澄清一下吗?

解决方法

>是的.
>你可以在 the documentation中看到这个(如果只是间接地).使用块可以抑制异常,但信号量的一个不应该这样做.也许在多处理的背景下(或者(或者在2015年)存在一个错误). >那是信号量的一种用途,是的. > SyncManager下的Semaphore这样的名称是创建由管理器支持的同步对象的函数 – 它们被命名为类,作为一个提示,就像类一样,它们被调用来制造新对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读