python品脫模塊實現物理量。我想與多處理一起使用它。但是,我不知道如何處理在新流程中創建UnitRegistry。如果我做了直觀的:具有多處理功能的Python品脫模塊
from multiprocessing import Process
from pint import UnitRegistry, set_application_registry
ureg = UnitRegistry()
set_application_registry(ureg)
Q = ureg.Quantity
def f(one, two):
print(one/two)
if __name__ == '__main__':
p = Process(target=f, args=(Q(50, 'ms'), Q(50, 'ns')))
p.start()
p.join()
然後我得到以下異常:
Traceback (most recent call last):
File "C:\WinPython-64bit-3.4.4.2Qt5\python-3.4.4.amd64\lib\multiprocessing\process.py", line 254, in _bootstrap
self.run()
File "C:\WinPython-64bit-3.4.4.2Qt5\python-3.4.4.amd64\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\pmaunz\PyCharmProjects\IonControl34\tests\pintmultiprocessing.py", line 12, in f
print(one/two)
File "C:\WinPython-64bit-3.4.4.2Qt5\python-3.4.4.amd64\lib\site-packages\pint\quantity.py", line 738, in __truediv__
return self._mul_div(other, operator.truediv)
File "C:\WinPython-64bit-3.4.4.2Qt5\python-3.4.4.amd64\lib\site-packages\pint\quantity.py", line 675, in _mul_div
offset_units_self = self._get_non_multiplicative_units()
File "C:\WinPython-64bit-3.4.4.2Qt5\python-3.4.4.amd64\lib\site-packages\pint\quantity.py", line 1312, in _get_non_multiplicative_units
offset_units = [unit for unit in self._units.keys()
File "C:\WinPython-64bit-3.4.4.2Qt5\python-3.4.4.amd64\lib\site-packages\pint\quantity.py", line 1313, in <listcomp>
if not self._REGISTRY._units[unit].is_multiplicative]
KeyError: 'millisecond'
我以爲是由於缺乏取儲存的參數之前初始化UnitRegistry的子進程的起源。 (初始化函數f中的UnitRegistry不起作用,因爲變量已經被取消了)。
我該如何去發送一個品脫數量到一個子進程?蒂姆·彼得回答後
編輯:
問題是不綁多。只要酸洗量
from pint import UnitRegistry, set_application_registry
import pickle
ureg = UnitRegistry()
set_application_registry(ureg)
Q = ureg.Quantity
with open("pint.pkl", 'wb') as f:
pickle.dump(Q(50, 'ms'), f)
pickle.dump(Q(50, 'ns'), f)
,然後在新腳本取儲存導致了同樣的問題:
from pint import UnitRegistry, set_application_registry
import pickle
ureg = UnitRegistry()
set_application_registry(ureg)
Q = ureg.Quantity
with open("pint.pkl", 'rb') as f:
t1 = pickle.load(f)
t2 = pickle.load(f)
print(t1/t2)
導致相同的異常。正如Tim指出的那樣,在取出前添加一行Q(50, 'ns'); Q(50, 'ms')
就足夠了。在深入挖掘pint的源代碼時,在單位ms
創建數量時,將該單元添加到內部註冊表中。酸洗使用UnitContainer
實例來保存單位。通過取消打印創建數量時,該單位是而不是添加到註冊表中。
一個簡單的修復(在品脫源代碼)是改變功能Quantity.__reduce__
返回一個字符串。
diff --git a/pint/quantity.py b/pint/quantity.py
index 3f30a25..695866a 100644
--- a/pint/quantity.py
+++ b/pint/quantity.py
@@ -57,7 +57,7 @@ class _Quantity(SharedRegistryObject):
def __reduce__(self):
from . import _build_quantity
- return _build_quantity, (self.magnitude, self._units)
+ return _build_quantity, (self.magnitude, str(self._units))
def __new__(cls, value, units=None):
if units is None:
我在pint的github網站上打開了一個問題。
Bravo!這一切都很有意義。我感到驚訝的是,之前沒有人遇到過這種情況 - 在一個過程中進行酸洗,而在另一個過程中進行酸洗就是使用泡菜的方式(即使沒有「多重處理」)! –