python – 跨进程共享多处理同步原语
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 跨进程共享多处理同步原语,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2546字,纯文字阅读大概需要4分钟。
内容图文
![python – 跨进程共享多处理同步原语](/upload/InfoBanner/zyjiaocheng/965/7bbf10eede08407d9163ed691a384bb4.jpg)
(Python 3.4,Linux).
我有一个主进程’P’,它会分叉8个进程(‘C1’到’C8’).我想创建multiprocessing.Barrier,确保所有8个子进程在某一点同步.
如果我在父进程中定义同步原语,一切正常,这样当我分叉子进程时,它被正确继承:
import multiprocessing as mp
barrier = mp.Barrier(8)
def f():
# do something
barrier.wait()
# do more stuff
def main():
for i in range(8):
p = mp.Process(target = f)
p.start()
if __name__ == '__main__':
main()
但在我的情况下,我不知道在子进程启动之后创建Barrier对象所需的详细信息(我不知道我想要传递的参数作为其action参数).因此,我想在其中一个子进程中创建Barrier,但我不知道如何使其可用于其他子进程.当然,以下内容不起作用,因为子进程中的8个Barrier对象完全相互独立:
import multiprocessing as mp
def f():
global barrier
# do something
barrier = mp.Barrier(8)
barrier.wait()
# do more stuff
def main():
for i in range(8):
p = mp.Process(target = f)
p.start()
if __name__ == '__main__':
main()
我想在其中一个子进程中创建barrier并使用multiprocessing.Queue将其传递给其他进程(或者如果Queue不接受Barrier对象,则使用multiprocessing.Manager().Barrier).但是,即使这样可行,我也不知道如何确保只有一个进程实际将(7个副本)同步原语放入队列,而其他进程只能获取它们. (当然,我可以在父进程中创建另一个同步原语来做到这一点,但是我不得不重构我的代码以在父进程中创建原始的Barrier.)
解决方法:
下面是一个示例,说明如何通过在一个子节点中创建multiprocessing.managers.BaseManager,然后从所有其他子节点连接到该管理器来实现此目的.请注意,它需要将多处理.Lock从父级传递给所有子级以进行同步,您提到您希望避免这种情况.不过,我不确定还有其他选择.
import multiprocessing as mp
from multiprocessing.managers import BaseManager
class MyManager(BaseManager):
pass
def f(lock):
# do something
with lock:
try:
MyManager.register('get_barrier')
m = MyManager(address=('localhost', 5555), authkey=b'akey')
m.connect()
b = m.get_barrier()
print("Got the barrier from the manager")
except OSError as e:
# We are the first. Create the manager, register
# a mp.Barrier instance with it, and start it up.
print("Creating the manager...")
b = mp.Barrier(8)
MyManager.register('get_barrier', callable=lambda:b)
m = MyManager(address=('localhost', 5555), authkey=b'akey')
m.start()
b.wait()
print("Done!")
# do more stuff
def main():
lock = mp.Lock()
for i in range(8):
p = mp.Process(target=f, args=(lock,))
p.start()
if __name__ == '__main__':
main()
输出:
Creating the manager...
Got the barrier from the manager
Got the barrier from the manager
Got the barrier from the manager
Got the barrier from the manager
Got the barrier from the manager
Got the barrier from the manager
Got the barrier from the manager
Done!
Done!
Done!
Done!
Done!
Done!
Done!
Done!
内容总结
以上是互联网集市为您收集整理的python – 跨进程共享多处理同步原语全部内容,希望文章能够帮你解决python – 跨进程共享多处理同步原语所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。