簡體   English   中英

Python多處理:未定義全局名稱

[英]Python multiprocessing: Global name is not defined

我正在嘗試使用Python多處理程序庫,但遇到全局定義變量的問題。 出於某種原因,我收到錯誤消息“ NameError:全局名稱...未定義”。原始程序涉及很多,因此我在下面的代碼中重現了我的問題:

import multiprocessing
import time
import timeit

def setGlobal():

    global globalVar
    globalVar = 2

def mp_worker(arguments):

    # do some processing.... 
    data = arguments[0]    
    # need to use global data
    the_time = globalVar    

    time.sleep(int(the_time))

def f(processes = 3):

    global pool   
    pool = multiprocessing.Pool(processes)

def mp_handler(number):

    inputs = []
    inputs.append([1]) 
    inputs.append([2]) 

    print("Begin multiprocessing test...for test "+str(number))
    start_time = timeit.default_timer()    
    pool.map(mp_worker, inputs)
    print("Time taken to calculate trades: %4.4f " %(timeit.default_timer() - start_time))


if __name__ == '__main__':
    #define global variable
    setGlobal()
    # initialise pool
    f(3)

    # Get error: NameError: global name 'globalVar' is not defined 
    mp_handler(1)

現在我嘗試了一個潛在的解決方案是:

import multiprocessing
import time
import timeit

globalVar = 4

def setGlobal(number):

    global globalVar
    globalVar = number

def mp_worker(arguments):

    # do some processing.... 
    data = arguments[0]    
    # need to use global data
    print("GlobalVar in my_worker = " + str(globalVar))
    the_time = globalVar
    time.sleep(int(the_time))

def f(processes = 3):

    global pool   
    pool = multiprocessing.Pool(processes)

def mp_handler(number):

    inputs = []
    inputs.append([1]) 
    inputs.append([2]) 
    print("GlobalVar in my_handler = " + str(globalVar))

    print("Begin multiprocessing test...for test "+str(number))
    start_time = timeit.default_timer()    
    pool.map(mp_worker, inputs)
    print("Time taken to calculate trades: %4.4f " %(timeit.default_timer() - start_time))


if __name__ == '__main__':

    # initialise pool
    f(3)

    mp_handler(1)

    # re-set global variable... has no effect   
    setGlobal(1)
    mp_handler(2)

但是,當我調用setGlobal(1)時,它在mp_worker中沒有作用嗎? 當我需要將全局定義的值設為1時,該值為4。為什么這樣做,並且可以解決此問題?

global語句不會使變量成為全局變量,而是使變量在函數范圍內可訪問。

只需在頂層設置變量(即,在任何函數或類之外),就可以使其成為全局變量。 因此,請在任何函數和類之外設置值,然后在需要在函數中進行更改時使用global var_name對其進行聲明。 請注意,僅在需要在函數中進行更改時,才需要使用global命令來讀取全局變量。

請注意,全局變量在多處理進程之間不能很好地發揮作用:我發現有必要使用多個multiprocessing.Queue對象在進程之間發送值(很糟糕)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM