Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用acquire和release信号量方法替换为关键字_Python_Multithreading_Python Multiprocessing - Fatal编程技术网

Python 用acquire和release信号量方法替换为关键字

Python 用acquire和release信号量方法替换为关键字,python,multithreading,python-multiprocessing,Python,Multithreading,Python Multiprocessing,我发现了以下将信号量与多处理模块结合使用的示例(这是修改版): #!/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):

我发现了以下将信号量与多处理模块结合使用的示例(这是修改版):

#!/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的
threading
multiprocessing
模块中,这些方法相当于
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()
从上一篇文章中我了解到,当某个方法与
with
关键字一起使用时,上下文管理器的
\uuuuuuuuuu()和
\uuuuuuuuuuuuuuu()
方法在
with
语句体的进入(和退出)时被调用。因此,我假设
acquire()
\uuuuu enter()
内部调用,
release()
\uuuuu exit()
内部调用

问题:

  • 是我关于从
    调用
    acquire()
    的假设
    release()
    \uuuu退出
    正确吗

  • 我能看看这个例子中的
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
    方法在做什么吗?我还注意到,当我使用
    version访问
    中未定义的变量时,我不会得到任何异常(必须有一些异常处理来简单地抑制错误)

  • 例如,即使
    ppid
    pid
    不存在,此函数也不会引发异常

    print "#####################"
    print "Inside locked semaphore"
    print "PPID: %s" % ppid
    print "PID:  %s" % pid
    
  • 这种使用信号量来确保关键部分中一个进程的独占性的方法正确吗
  • 作为一名python初学者,我不明白为什么
    BoundedSemaphore([value])
    Semaphore([value])
    嵌套在中的
    类multiprocessing.managers.SyncManager
    下。您能澄清一下吗
  • 您可以在中看到这一点(如果只是间接的话)<代码>with
  • 块可以抑制异常,但信号量块不应该这样做。也许在
    多处理
    的上下文中(或者在2015年有(或者曾经有)一个bug)有一个复杂性
  • 这是信号灯的用途之一,是的
  • SyncManager
    下的
    Semaphore
    等名称是用于创建由管理器支持的同步对象的函数。它们被命名为类,作为一种提示,与类一样,它们被调用以创建新对象

  • “不知怎么看”是什么意思?在运行时查看源代码、文档或证据?