[英]Python Pandas shared DataFrames across Multiprocessing Managers
我有一個multiprocessing.manager.BaseManager
實現,共享資源是一個類,該類返回各種數據的DataFrames。 我遇到的問題是,由於熊貓不是線程安全的,因此進程共享它們正在處理的數據的實例。 這導致Python崩潰。
我嘗試做的是在多處理管理器類中MakeProxyType
方法(請參閱: https : //github.com/python/cpython/blob/8c83c23fa32405aa9212f028d234f4129d105a23/Lib/multiprocessing/managers.py#L938 )來執行此操作:
for meth in exposed:
if meth.startswith("load"):
exec('''def %s(self, *args, **kwds):
return self._callmethod(%r, args, kwds).copy()''' % (meth, meth), dic)
else:
exec('''def %s(self, *args, **kwds):
return self._callmethod(%r, args, kwds)''' % (meth, meth), dic)
但是,它實際上並沒有給我數據副本。 當我查看輸出變量時,我看到一些變量共享相同的內存地址(表示它們具有相同的星號#):
Thread 1: 0xa225630 ***
Thread 2: 0xa245518 *
Thread 3: 0xa225518 *
Thread 4: 0xa225518 *
Thread 5: 0xa2284a8
Thread 6: 0xa225550 **
Thread 7: 0xa245550 **
Thread 8: 0xa245630
Thread 9: 0xa225630 ***
當我嘗試使用進程內的熊貓操作數據時,這會引起問題。
有人可以幫我從這里出去嗎? 關於如何強制多處理管理器為我提供這些DataFrames的唯一實例,以便避免python崩潰的任何想法? 多處理管理器似乎是一個很棒的類-但是它的文檔非常薄。
所以我仍然不是問題的100%,但是在multiprocessing
庫中有一個未記錄的類,稱為ThreadPool
( https://github.com/python/cpython/blob/master/Lib/multiprocessing/pool.py )。 與啟動進程相比,啟動線程不僅具有更少的開銷,而且管理器現在還可以返回每個DataFrame
不同副本!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.