![](/img/trans.png)
[英]python NameError: global name 'multiprocessing' is not defined
[英]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.