RTGraph
RTGraph copied to clipboard
TypeError: can't pickle weakref objects when running demo in Simulator mode
Hi! I tried to run your demo in Simulator mode, but this error occurred after start.
Here is the traceback:
Traceback (most recent call last):
File "D:\ProgramData\Anaconda3\lib\site-packages\rtgraph\ui\mainWindow.py", line 62, in start
if self.worker.start():
File "D:\ProgramData\Anaconda3\lib\site-packages\rtgraph\core\worker.py", line 80, in start
self._acquisition_process.start()
File "D:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 112, in start
self._popen = self._Popen(self)
File "D:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "D:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "D:\ProgramData\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
reduction.dump(process_obj, to_child)
File "D:\ProgramData\Anaconda3\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle weakref objects
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "D:\ProgramData\Anaconda3\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "D:\ProgramData\Anaconda3\lib\multiprocessing\spawn.py", line 115, in _main
self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
I found out that this error occurred because self._parser_process.start() is called before self._acquisition_process.start()
And here is my simulated program where the same error occurs:
from multiprocessing import Process,Event
import time
class TestProcess(Process):
def __init__(self):
Process.__init__(self)
self._exit=Event()
def stop(self):
self._exit.set()
def run(self):
while not self._exit.is_set():
pass
class TestProcessB(TestProcess):
def __init__(self,p):
Process.__init__(self)
self._test_process=p
def run(self):
while not self._exit.is_set():
print(time.time())
time.sleep(1)
if __name__=='__main__':
tp=TestProcess()
tpb=TestProcessB(tp)
tp.start()
tpb.start()
time.sleep(10)
tp.stop()
tpb.stop()
How can this problem be fixed?
I found the official response to this problem: https://bugs.python.org/issue34034
It could be many different things. The bottom line here, though, is that the Process class is not designed to be picklable (how would it work?), which is probably why you're seeing this.
It happens to be OK in python 3.4-3.6
Would you please fix this problem (to support python 3.7 and future versions)?
I had the same problem with serial and export to CSV enable...
Im using python 3.5