【问题标题】:Python - Multiprocessing Process module - function variable not defined?Python - 多处理过程模块 - 未定义函数变量?
【发布时间】:2020-02-12 15:41:09
【问题描述】:

我试图测试一些多处理代码。下面的代码工作正常:

from multiprocessing import Process

def print_func(continent='Asia'):
    print('The name of continent is : ', continent)

if __name__ == "__main__":  
    names = ['America', 'Europe', 'Africa']
    procs = []
    proc = Process(target=print_func)  # instantiating without any argument
    procs.append(proc)
    proc.start()

    # instantiating process with arguments
    for name in names:
        # print(name)
        proc = Process(target=print_func, args=(name,))
        procs.append(proc)
        proc.start()

    # complete the processes
    for proc in procs:
        proc.join()

但是,如果我在if __name__ == "__main__": 中添加一个新变量,并在target 中使用该变量,那么target 函数将无法识别该变量。

def print_func(continent='Asia'):
    print('The name of continent is : ', continent, ' ', t)

if __name__ == "__main__":  # confirms that the code is under main function
    names = ['America', 'Europe', 'Africa']
    t = 'continent'
    procs = []
    proc = Process(target=print_func)  # instantiating without any argument
    procs.append(proc)
    proc.start()

    # instantiating process with arguments
    for name in names:
        # print(name)
        proc = Process(target=print_func, args=(name,))
        procs.append(proc)
        proc.start()

    # complete the processes
    for proc in procs:
        proc.join()

会有错误:NameError: name t is not defined. 这个错误对我来说很奇怪,而且不合理,因为在下面的简单代码中不会有这个问题:

import pandas as pd

def my_func(c):
  f['b'] = c
  print(f)

if __name__ == "__main__":
    f = pd.DataFrame({'a':[1,2,3]})
    my_func(2)

那么导致 NameError 的原因是什么?

【问题讨论】:

  • @stovfl 现在我知道不建议跨进程共享数据。但是,有没有办法让多个进程同时共享同一个 pd.DataFrame?似乎可以共享值/字符串/列表/字典,但不确定 DataFrame 是否也可共享。
  • @stovfl 使用来自 Manager() 的 Namespace() 似乎工作...
  • “使用来自 Manager() 的 Namespace() 似乎有效”:随意发布社区 wiki 答案,右下方复选框展示你的解决方案。

标签: python function process python-multiprocessing nameerror


【解决方案1】:

在这里回答我的问题。 Manager() 可能是解决方案。在下面的代码中,除了可以访问字符串 t,我还展示了如何访问其他 python 对象,例如 pandas DataFrame。

from multiprocessing import Process, Manager
import pandas as pd
import numpy as np

def print_func(ns, continent='Asia'):
    p_pd = ns.df
    p_pd.iloc[0] = continent
    print('The name of continent is : ', continent, ' ', ns.t)
    print(p_pd.iloc[0])

if __name__ == "__main__":  # confirms that the code is under main function
    mgr = Manager()
    ns = mgr.Namespace()
    names = ['America', 'Europe', 'Africa']
    ns.t = 'continent'
    ns.df = pd.DataFrame(np.ones((2,5)))
    procs = []

    # instantiating process with arguments
    for name in names:
        # print(name)
        proc = Process(target=print_func, args=(ns, name))
        procs.append(proc)
        proc.start()

    # complete the processes
    for proc in procs:
        proc.join()

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多