【问题标题】:Pathos“函数导入期间发生错误”
【发布时间】:2022-01-18 17:34:30
【问题描述】:

当我尝试执行这段代码时:

import pathos
from network import *


def simulation(error_rate=1):
    network = Network(error_rate=1)
    network.gen_transceiver_pair(1)
    network.run()
    mend = network.master_transceivers[0].cycle[0, 2]
    send = network.slave_transceivers[0].cycle[0, 2]
    return send if send > mend else mend

if __name__ == '__main__':
    p = pathos.pools.ParallelPool(nodes=10)
    result = p.map(simulation, [1, 1, 1])

我收到此错误:

An error has occured during the function import
Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\network_simu\venv\lib\site-packages\ppft\__main__.py", line 100, in run
    six.exec_(__fobj)
  File "<string>", line 1, in <module>
  File "<string>", line 6, in Network
NameError: name 'signal' is not defined
A fatal error has occured during the function execution
Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\network_simu\venv\lib\site-packages\ppft\__main__.py", line 109, in run
    __f = locals()[ppc.str_(__fname)]
KeyError: 'simulation'

是因为我在函数内部生成了一个Network 对象吗?理想情况下,我希望以不同的错误率(1、.9 等)运行模拟 10^6-10^7 次。我尝试使用multiprocessing 运行,但无法腌制该功能,因此我尝试使用Pathos

编辑:我正在使用来自blinker 模块的signal。代码在正常执行时工作。我已经完成了 10^6 次迭代,没有任何问题,但这需要很长时间。

编辑2: 我正在使用这样的信号:

class Pool:
    def __init__(self):
        Transceiver.pool_add.connect(self.add)
        Transceiver.pool_remove.connect(self.remove)
        Network.return_cycle.connect(self.set_cycle)
        self.cycle = 0
        self.pool = []

    def set_cycle(self, sender):
        self.cycle = sender.cycle

    def add(self, sender):
        if VERBATIM:
            print("added " + sender.t_id)
        self.pool.insert(0, sender)
        sender.cycle[0, 0] = self.cycle

    def remove(self, sender):
        if VERBATIM:
            print("removed " + sender.t_id)
        self.pool.remove(sender)
        sender.cycle[0, 2] = self.cycle

class Transceiver(NetworkComponent):
    __STATUS = ["off", "t_on", "r_on", "on"]
    pool_add = signal("pool_add")
    pool_remove = signal("pool_remove")
    __ID = iter(range(1, 41))

Edit3:所以我删除了signal 的使用。现在我得到这个错误:

Backend TkAgg is interactive backend. Turning interactive mode on.
An error has occured during the function import
Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\network_simu\venv\lib\site-packages\ppft\__main__.py", line 100, in run
    six.exec_(__fobj)
  File "<string>", line 1, in <module>
  File "<string>", line 7, in Network
NameError: name 'np' is not defined
A fatal error has occured during the function execution

npnumpy... 很奇怪

【问题讨论】:

  • blinker 不保证密钥“信号”的可用性。您可以在不崩溃的情况下处理此异常吗?
  • 我不确定我是否理解。所以通常由于进程不共享相同的内存空间,发出信号不应该“触发”其他类实例?信号被定义为类属性。编辑:添加了我如何实现信号的示例。
  • 我去掉了signal的使用,现在得到一个numpy没有定义的错误?
  • 既然你没有import numpy as np,我对它没有定义并不感到惊讶。
  • Numpy 被 Network 对象使用。此外,from network import *network 已将 numpy 作为 np 导入...还尝试在我的主脚本中将 numpy 作为 np 导入,但这也不起作用。我可以在没有悲伤的情况下进行模拟。

标签: python-3.x multiprocessing python-multiprocessing pathos


【解决方案1】:

我是pathos 作者。首先,您使用的是ParallelPool,它使用ppft... 它使用dill.source 将对象转换为源代码,然后将源代码传递给新进程,然后构建一个新对象并执行。你可能想试试ProcessPool,它使用multiprocess,它使用dill,它使用更标准的对象序列化(如pickle)。此外,当您序列化代码时(使用dilldill.source),您应该注意确保代码尽可能自封装。我的意思是:

def sin2(x):
    import numpy as np
    return np.sin(x)**2

将比

有更好的序列化机会
import numpy as np

def sin2(x):
    return np.sin(x)**2

因为后者依赖于序列化程序来追踪sin2 中所有未定义的项目。因此,只需在您打算并行使用的任何函数中添加所有导入,它就更有可能工作。 (请注意,上述两种方法都应该有效,但前者在序列化程序上比后者更容易。)对于函数和在您要序列化的对象的命名空间内使用的任何其他对象实际上也是如此,但是在封闭的命名空间中通过引用查找找到。可以这样想:序列化程序保证发送您所针对的任何功能......并且本质上将其传输到另一个处理器并执行该代码。如果还需要参考查找,但未复制...那么它将失败。因此,通过简化包含您要发布的代码的命名空间层次结构并减少您要发布的代码之外的依赖项的数量,帮助它不会失败。

【讨论】:

  • 最终在network 模块中创建函数simulation 并使用ProcessingPool。我再次使用代码,它也适用于ProcessPool(node=n)。我想知道ProcessingPoolProcessPool 有什么区别?在文档中找不到ProcessingPool...另外,谢谢你的回答,现在我明白了为什么我看到的一些例子的函数中有import xxx(认为它相当于把它放在开头模块!)
  • 太好了。所以...ProcessingPool = ProcessPool 以实现向后兼容性。留在那里是为了不破坏人们的旧代码。
猜你喜欢
  • 2012-07-07
  • 2017-09-27
  • 2012-10-16
  • 1970-01-01
  • 2012-08-03
  • 2021-03-02
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
相关资源
最近更新 更多