首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python 进程间通信 使用共享内存 脚本

python 进程间通信 使用共享内存 脚本

作者头像
用户5760343
发布2022-05-13 17:02:31
发布2022-05-13 17:02:31
8000
举报
文章被收录于专栏:sktjsktj
代码语言:javascript
复制
"""
 Use multiprocess shared memory objects to communicate.
 Passed objects are shared, but globals are not on Windows.
 Last test here reflects common use case: distributing work.
 """
import os
 from multiprocessing import Process, Value, Array
procs = 3
 count = 0    # per-process globals, not shared
def showdata(label, val, arr):
 """
 print data values in this process
 """
 msg = '%-12s: pid:%4s, global:%s, value:%s, array:%s'
 print(msg % (label, os.getpid(), count, val.value, list(arr)))
def updater(val, arr):
 """
 communicate via shared memory
 """
 global count
 count += 1                         # global count not shared
 val.value += 1                     # passed in objects are
 for i in range(3): arr[i] += 1
if name == 'main':
 scalar = Value('i', 0)             # shared memory: process/thread safe
 vector = Array('d', procs)         # type codes from ctypes: int, double
代码语言:javascript
复制
# show start value in parent process
showdata('parent start', scalar, vector)

# spawn child, pass in shared memory
p = Process(target=showdata, args=('child ', scalar, vector))
p.start(); p.join()

# pass in shared memory updated in parent, wait for each to finish
# each child sees updates in parent so far for args (but not global)

print('\nloop1 (updates in parent, serial children)...')
for i in range(procs):
    count += 1
    scalar.value += 1
    vector[i] += 1
    p = Process(target=showdata, args=(('process %s' % i), scalar, vector))
    p.start(); p.join()

# same as prior, but allow children to run in parallel
# all see the last iteration's result because all share objects

print('\nloop2 (updates in parent, parallel children)...')
ps = []
for i in range(procs):
    count += 1
    scalar.value += 1
    vector[i] += 1
    p = Process(target=showdata, args=(('process %s' % i), scalar, vector))
    p.start()
    ps.append(p)
for p in ps: p.join()

# shared memory updated in spawned children, wait for each

print('\nloop3 (updates in serial children)...')
for i in range(procs):
    p = Process(target=updater, args=(scalar, vector))
    p.start()
    p.join()
showdata('parent temp', scalar, vector)

# same, but allow children to update in parallel

ps = []
print('\nloop4 (updates in parallel children)...')
for i in range(procs):
    p = Process(target=updater, args=(scalar, vector))
    p.start()
    ps.append(p)
for p in ps: p.join()
                                       # global count=6 in parent only
# show final results here              # scalar=12:  +6 parent, +6 in 6 children
showdata('parent end', scalar, vector) # array[i]=8: +2 parent, +6 in 6 children
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档