从 multiprocessing.Process 继承的 Python 类的设置值问题

2024-01-08

为什么这段代码

import multiprocessing
import time

class Bot(multiprocessing.Process):
    def __init__(self):        
        self.val = 0
        multiprocessing.Process.__init__(self)

    def setVal(self):
        self.val = 99

    def run(self):        
        while True:            
            print 'IN: ', self.val
            time.sleep(2)

if __name__ == '__main__':  
    bot = Bot()
    bot.start()
    bot.setVal()
    while True:
        print 'OUT: ', bot.val
        time.sleep(2)            

给出以下输出?

OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
OUT:  99
IN:  0
...

正如你可能猜到的那样,我希望得到全部 99 个,IN 和 OUT。但我不。为什么?我缺少什么?


一旦你打过电话start()在您的对象上,该对象内部的内容在单独的进程中运行,并且使用该类的方法与其“通信”并不是真正的最佳方法。你需要做的事情叫做进程间通信(简称IPC)并且有特殊的机制可以正确地做到这一点。

对于Python来说multiprocessing模块中有两种进程间通信的机制:Pipe and Queue。我建议调查这些(例如here http://docs.python.org/2/library/multiprocessing.html#pipes-and-queues).

要使用Pipe在您的示例中的机制,您可以这样做(只是一个快速说明):

class Bot(multiprocessing.Process):
    def __init__(self, pipe):
        multiprocessing.Process.__init__(self)
        self.val = 0
        self.ipcPipe = pipe

    def run(self):
        while True: 
            newData = self.ipcPipe.recv()
            self.val = newData[0]
            print 'IN: ', self.val
            self.ipcPipe.send([self.val])
            time.sleep(2)

if __name__ == '__main__': 
    parent_conn, child_conn = multiprocessing.Pipe()
    bot = Bot(child_conn)
    bot.start()
    value = 0
    while True:
        value += 1
        parent_conn.send([value])
        outVal = parent_conn.recv()
        print 'OUT: ', outVal[0]
        time.sleep(2)

看看这里做了什么:我们创建了父级和子级的“端”Pipe,并将子对象交给您的对象。然后从您使用的父进程send()向对象传达新值,并且recv()获取更新后的值。同样,在你的对象内部(记住一个单独的过程)你反过来使用send() and recv()在管道的另一端与父进程通信。

另外,我建议您致电Process.__init__(self)在你的班级里__init__ method before进行任何其他初始化。既然你继承自Process在您自己的类中执行任何操作之前,最好确保引擎盖下的所有进程内容都已正确初始化。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 multiprocessing.Process 继承的 Python 类的设置值问题 的相关文章

随机推荐

  • MonoDevelop 中的调试/跟踪输出

    在 MonoDevelop 中哪里可以看到 System Diagnostics Debug 和 System Diagnostics Trace 输出 我认为它应该出现在 ApplicationOutput 窗口中 但无处可寻 应用程序输
  • 关于图像加载 IE 问题的 JavaScript/jQuery 事件侦听器

    我正在寻找一种方法来为尽可能多的浏览器实现此功能 var image new Image image addEventListener load function alert loaded false image src image url
  • C++ math.h abs() 与我的 abs() 相比有什么不同

    我目前正在用 C 编写一些像向量数学类的 glsl 并且我刚刚实现了一个abs 像这样的函数 template
  • 如何使用 Python 模块 Dragonfly 识别语音?

    我一直在试图弄清楚如何使用 Dragonfly 模块 我查看了文档 但似乎不知道如何使用它 我只想能够识别一些短语并根据这些短语采取行动 是的 这个例子将终止 我已经看过这个特定的例子很多了 它缺少一些关键功能 首先是 pythoncom
  • Apache Spark join 操作的扩展能力较差

    我在 Apache Spark 上运行 join 操作 发现没有弱可扩展性 如果有人能解释这一点 我将不胜感激 我创建两个数据帧 a b 和 a c 并通过第一列连接数据帧 我为 一对一 连接生成数据帧值 另外 我使用相同的分区器来避免随机
  • 文本字段在 iOS 模拟器上不显示键盘

    我试图使用基本文本字段在这里构建一个简单的登录屏幕 但我无法让键盘出现在模拟器中 通过物理键盘输入效果很好 但在 iOS 模拟器中没有可见的键盘 我必须明确打开它还是什么 感觉我在这里错过了一些非常基本的东西 buildLoginScree
  • 封闭件损坏 - 请帮我修复它

    in a 相关问题 https stackoverflow com questions 4584397 javascript countdown clock 4584501我已经发布了这段代码 它几乎可以工作 但计数器却不能 我们可以修复它
  • 如何在 OpenVDB 中对网格进行下采样

    OpenVDB中有什么好的方法可以对体素网格进行下采样吗 例如 我有体素大小为 1 0 的网格 8x8x8 我想要获得体素大小为 2 0 的网格 4x4x4 each voxel of new grid is some interpolat
  • CoreAudio - 如何确定播放aac文件的结尾

    我正在 iPhone 上使用 CoreAudio 但我无法找到如何知道歌曲何时播放完毕 我放了一个属性监听器kAudioQueueProperty IsRunning 它在开始播放时有效 但在文件结尾时无效 当我停止 AudioQueue
  • 如何显示api函数的输出?

    抱歉问基本问题 我正在尝试在 QPlainTextWidget 中显示 json 我有 api 函数 它有控制台输出并包含所有需要的数据 看起来像这样 int iperf run server struct iperf test test
  • npm 错误! 403 403 禁止 npm 发布

    我尝试在 npm 上发布公共包 但出现此错误 npm ERR code E403 npm ERR 403 403 Forbidden PUT https registry npmjs org clem b 2fweather Forbidd
  • OSX (XNU) 系统调用的实际记录在哪里?

    我正在浏览系统调用 master https opensource apple com source xnu xnu 4570 71 2 bsd kern syscalls master文件在这里 但根本没有记录 系统调用的文档是否存在 如
  • 谁能解释为什么这种排序不起作用?

    例如 如果我有一个这样的列表 List1 7 6 9 List1 List1 sort list sort 对列表进行就地排序并返回None 所以你实际上将该返回值分配给List1 i e None gt gt gt List1 7 6 9
  • Android Viewpager Tinder 类似 UI,具有 3D 卡堆栈外观

    我正在尝试使用 ViewPager 在 android 中创建一个类似火种的用户界面 我看过这个图书馆 https github com kikoso Swipeable Cards 但我希望在向右滑动后能够看到上一张卡片 因此首选 Vie
  • 如何在 IE 的 google chrome 框架插件中启用文件协议

    我想在带有 chrome 框架的 IE 中打开一个 Html5 页面 但只支持 http 协议 我无法从磁盘打开 html 文件 在注册表路径中HKCU 软件 Google ChromeFrame添加这个键 允许不安全URL 1 DWORD
  • 使用 jQuery 和 AJAX 加载部分页面

    我在页面 A 和 div 上有一个动态链接列表 我希望在其中加载基于 PHP 变量的另一个动态生成的页面 B 的内容 a href loader php id 1 Link 1 a a href loader php id 2 Link 2
  • 如何将 Amazon Redshift 连接到 python

    这是我的 python 代码 我想将我的 Amazon Redshift 数据库连接到 Python 但它在主机中显示错误 谁能告诉我正确的语法 我是否正确传递了所有参数 con psycopg2 connect dbname pg tab
  • 如何获取 CSV 文本文件中特定字段的最大值?

    我的每一行文本文件示例 CSV 逗号分隔 如下 2016 01 10 23 56 07 10 71 47 可以看出 字段 3 4 和 5 是numeric价值观 对于每一行 我只想得到maximum字段值3 and 4 就像是 awk F
  • 如何从命名空间实现函数?

    本质上 这是我的源代码 namespace name int func void int main void name int func void body return 0 现在 我想在不同的地方编写该函数 声明为 int 命名空间 您不
  • 从 multiprocessing.Process 继承的 Python 类的设置值问题

    为什么这段代码 import multiprocessing import time class Bot multiprocessing Process def init self self val 0 multiprocessing Pr