我正在嘗試通過apply_async( https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.AsyncResult ) 呼叫來完成兩件事:
(i) 呼叫類方法
(ii) 傳遞一個物件作為引數
到目前為止,我有以下基線代碼:
import multiprocessing as mp
class myClass():
def __init__(self, id):
self.id = id
self.val = 1.0
self.pool = None
def callback(self, obj):
self.val = obj.val
def foo(new_val): # foo is outside myClass
print ('foo passed with', new_val)
c1.val = new_val
return c1
if __name__ == '__main__':
c1 = myClass('c1')
c1.pool = mp.Pool(processes=1)
c1.pool.apply_async(foo, args=(2.0, ), callback=c1.callback).wait()
c1.pool.close()
c1.pool.join()
print ('c1.val:', c1.val) # should display 'c1 val: 2.0'
輸出:
foo passed with 2.0
c1.val: 2.0
當我嘗試使用下面的代碼完成 (i) 時,我沒有得到與上面相同的輸出。
class myClass():
def __init__(self, id):
self.id = id
self.val = 1.0
self.pool = None
def callback(self, obj):
self.val = obj.val
def foo(self, new_val): # foo is inside myClass
print ('foo passed with', new_val)
self.val = new_val
return self
if __name__ == '__main__':
c1 = myClass('c1')
c1.pool = mp.Pool(processes=1)
c1.pool.apply_async(c1.foo, args=(2.0, ), callback=c1.callback).wait()
c1.pool.close()
c1.pool.join()
print ('c1.val:', c1.val) # should display 'c1 val: 2.0'
輸出:
c1.val: 1.0
同樣,當我嘗試完成 (ii) 時,foo不會再次被呼叫。
class myClass():
def __init__(self, id):
self.id = id
self.val = 1.0
self.pool = None
def callback(self, obj):
self.val = obj.val
def foo(obj, new_val): # foo is outside myClass
print ('foo passed with', new_val)
obj.val = new_val
return obj
if __name__ == '__main__':
c1 = myClass('c1')
c1.pool = mp.Pool(processes=1)
c1.pool.apply_async(foo, args=(c1, 2.0, ), callback=c1.callback).wait()
c1.pool.close()
c1.pool.join()
print ('c1.val:', c1.val) # should display 'c1 val: 2.0'
輸出:
c1.val: 1.0
知道上面的代碼需要更改什么才能完成 (i) 和 (ii) 嗎?
uj5u.com熱心網友回復:
呼叫未引發例外而未完成。您可以使用以下multiprocessing.pool.AsyncResult.successful方法進行檢查:
import multiprocessing as mp
class myClass():
def __init__(self, id):
self.id = id
self.val = 1.0
self.pool = None
def callback(self, obj):
self.val = obj.val
def foo(self, new_val):
print ('foo passed with', new_val)
self.val = new_val
return self
if __name__ == '__main__':
c1 = myClass('c1')
c1.pool = mp.Pool(processes=1)
async_result = c1.pool.apply_async(c1.foo, args=(2.0, ), callback=c1.callback)
async_result.wait()
print(async_result.successful()) # this is printing False!!!
c1.pool.close()
c1.pool.join()
print ('c1.val:', c1.val)
現在您可以定義一個error_callback以查看發生了什么:
...
async_result = c1.pool.apply_async(c1.foo, args=(2.0, ), callback=c1.callback, error_callback=lambda x: print(x))
...
這是此函式列印的錯誤:
pool objects cannot be passed between processes or pickled
在這個 SO 問題上,您可以找到有關為什么會發生這種情況的更多資訊。問題是multiprocessing代碼必須挑選它發送給它已經啟動的子行程的東西,而挑選器不執行實體方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533675.html
上一篇:計算達到給定截止日期的案例數
