python – 用获取和释放信号量方法替换关键字
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() 例如.即使ppid和pid不存在,这个也不会抛出异常 print "#####################" print "Inside locked semaphore" print "PPID: %s" % ppid print "PID: %s" % pid >这种使用信号量的方法是否确保关键部分中一个过程的排他性是正确的? 解决方法
>是的.
>你可以在 the documentation中看到这个(如果只是间接地).使用块可以抑制异常,但信号量的一个不应该这样做.也许在多处理的背景下(或者(或者在2015年)存在一个错误). >那是信号量的一种用途,是的. > SyncManager下的Semaphore这样的名称是创建由管理器支持的同步对象的函数 – 它们被命名为类,作为一个提示,就像类一样,它们被调用来制造新对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |