簡體   English   中英

python multiprocessing子進程無法訪問全局變量

[英]python multiprocessing child process cannot access to global variable

我創建了pandas數據框的全局變量。 我希望子進程可以訪問全局數據框,但是似乎子進程無法獲取全局變量。

data = pd.DataFrame(data = np.array([[i for i in range(1000)] for j in range(500)]))

def get_sample(i):
    print("start round {}".format(i))
    sample = data.sample(500, random_state=i)
    xs = sample.sum(axis=0)
    if i < 10:
        print(data.shape())
        print(sample.iloc[:3, :3])
    print("rount{} returns output".format(i))
    return xs

samples = []
def collect(result):
    print("collect called with {}".format(result[0][0].shape))
    global samples
    samples.extend(result)

ntasks = 1000
if __name__=='__main__':
    samples = []
    xs = pd.DataFrame()
    """sampling"""
    pool = mp.Pool(cpu_count(logical=True))
    print("start sampling, total round = {}".format(ntasks))
    r = pool.map_async(get_sample, [j for j in range(ntasks)], callback=collect)
    r.wait()
    pool.close()
    pool.join()

    xs = pd.concat([sample for sample in samples], axis = 1, ignore_index=True)
    xs = xs.transpose()

    print("xs: ")
    print(xs.shape)
    print(xs.iloc[:10, :10])

全局數據幀是數據。 我希望在每個子進程中,函數get_sample都可以訪問數據並從數據中檢索一些值。 為了確保子進程可以獲取數據,我在每個子進程中打印出數據的形狀。 問題在於子進程似乎無法獲取數據,因為當我運行它時,沒有打印出數據的形狀或部分樣本。

此外,我收到錯誤消息:追溯(最近一次呼叫最近):文件“ sampling2c.py”,第51行,xs = pd.concat([用於樣本的樣本],軸= 1,ignore_index = True)文件“ / usr / usc / python / 3.6.0 / lib / python3.6 / site-packages / pandas / tools / merge.py“,行1451,在concat copy = copy中)文件” /usr/usc/python/3.6.0 /lib/python3.6/site-packages/pandas/tools/merge.py“,第1484行,在init中引發ValueError('No objects to concatenate'),似乎get_sample函數未返回任何內容,采樣失敗。

但是,當我做一個實驗來測試子進程是否可以訪問全局變量時,它就起作用了。

df = pd.DataFrame(data = {'a':[1,2,3], 'b':[2,4,6]})
df['c1'] = [1,2,1]
df['c2'] = [2,1,2]
df['c3'] = [3,4,4]

df2 = pd.DataFrame(data = {'a':[i for i in range(100)], 'b':[i for i in range(100, 200)]})
l = [1, 2, 3]
Mgr = Manager()
results = []
def collect(result):
    global results
    #print("collect called with {}".format(result))
    results.extend(result)

counter = 12
def sample(i):
    print(current_process())
    return df2.sample(5, random_state = i)

if __name__=='__main__':
    pool = Pool(3)
    r = pool.map_async(sample, [i for i in range(3)], callback = collect) #callback = collect
    r.wait()
for res in results:
    print(res)

每個子進程都可以訪問全局變量df2。 我不確定子進程為什么無法訪問第一段代碼中的數據。

使用多處理程序生成進程時,新進程將在生成時獲得狀態的副本。

如果要在父進程或其他同級進程之間通信數據,則可以使用共享變量或處理共享對象的服務器進程進行通信。 有關詳細信息,請參見進程之間的共享狀態。

如果改用線程,則各個線程都在同一上下文中運行,共享所有全局變量。 因此,您無需執行任何特殊操作即可訪問所有線程和主循環中的所有全局變量。

線程和多處理都有其優點和缺點,但這不是討論這些的地方。

暫無
暫無

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

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