gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:57 25 4
gpt4 key购买 nike

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

如您所见,在此上下文中,信号量与 with 关键字一起使用。一般来说,信号量有两个方法wait()signal()。在 python 的 threadingmultiprocessing 模块中,这些方法据我所知等同于 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()

来 self 之前的 question我了解到,当某些方法与 with 关键字一起使用时,将在进入时调用上下文管理器的 __enter__()__exit__() 方法(并分别退出)从 with 语句的主体。所以我假设 acquire()__enter__() 内部调用,而 release()__exit__() 内部调用>.

问题:

  1. 我假设从 __enter__() 调用 acquire() 并且__exit__() 中的 release() 正确吗?

  2. 我能否以某种方式了解 __enter__()__exit__() 方法在此示例中的作用?我还注意到,当我在 with 版本中访问 undefined variable 时,我没有得到任何异常(它必须有一些异常处理,它只是抑制错误)。

    <

例如即使 ppidpid 不存在,这个也不会抛出异常

print "#####################"
print "Inside locked semaphore"
print "PPID: %s" % ppid
print "PID: %s" % pid
  1. 这种使用信号量来确保关键部分中一个进程的独占性的方法是否正确?
  2. 作为 Python 初学者,我不明白为什么 BoundedSemaphore([value])Semaphore([value]) 嵌套在 class multiprocessing.managers 下。 documentation 中的 SyncManager你能澄清一下吗?

最佳答案

  1. 是的。
  2. 您可以在 the documentation 中看到这一点(如果只是间接地) . with block 可以抑制异常,但信号量不应该这样做。也许在 multiprocessing 的上下文中存在复杂性(或者存在(或在 2015 年曾经存在)错误)。
  3. 是的,这是信号量的用途之一。
  4. SyncManager 下的 Semaphore 等名称是创建由管理器支持的同步对象的函数——它们的命名类似于类,暗示它们像类一样,被要求制造新元素。

关于python - 用获取和释放信号量方法替换关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32340675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com