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
等名称是用于创建由管理器支持的同步对象的函数。它们被命名为类,作为一种提示,与类一样,它们被调用以创建新对象“不知怎么看”是什么意思?在运行时查看源代码、文档或证据?