簡體   English   中英

如何將未腌制的對象作為參數傳遞給multiprocessing.Process?

[英]How to pass unpickled object as argument in multiprocessing.Process?

我正在摘除一個對象並作為process的args之一傳遞。沒有輸出。

我想知道這種取消拾取和將對象作為參數傳遞的方法是否會引起多處理錯誤。 為此將有什么解決方法?

from multiprocessing import Process, Queue
def func(arg1, arg2,q):
    df_temp = arg1[arg1['col'].isin(arg2)]
    q.put(df_temp)

if __name__ == '__main__':
    import pickle
    import pandas as pd
    arg1= pickle.load(open('paths.p','rb'))
    arg2= pd.Series(pd.date_range(end = 'some_Date', periods=12,freq = 'MS')).dt.to_pydatetime()
    arg2=[i.date() for i in arg2]
    q = Queue()
    p =Process(target=func, args=(arg1,arg2,q))
    p.start()
    p.join()    
    while not q.empty():
        w=q.get() 

您因其他原因陷入僵局。

默認情況下,如果進程不是隊列的創建者,那么在退出時它將嘗試加入隊列的后台線程。 該進程可以調用cancel_join_thread()使join_thread()不執行任何操作。 文檔

您的Process不會退出,因為它正在從multiprocessing.Queue加入一個供料器線程,該線程將在您第一次queue.put()立即啟動。 加入流程之前,您需要在父級中使用queue.get()

警告:如上所述,如果子進程已將項目放入隊列中(並且未使用JoinableQueue.cancel_join_thread),則該進程將不會終止,直到所有緩沖的項目都已刷新到管道中為止。 這意味着,如果您嘗試加入該進程,則除非您確定已耗盡所有已放入隊列的項目,否則可能會陷入僵局。 同樣,如果子進程是非守護進程,則當父進程嘗試加入其所有非守護進程子進程時,其父進程可能會在退出時掛起。 文檔

也不要在不使用while not q.empty() ,這是一種反模式,一旦有多個使用者,就會導致死鎖。 請使用哨兵值來通知消費者不再有其他物品。 有關此的更多信息,請點擊此處

暫無
暫無

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

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