我正在尝试使用Python 3.4为一个项目制作多线程飞行软件,在此过程中,如果传感器读取或其他异常崩溃发生I/O错误,需要让线程能够重新启动自身。因此,我正在研究如何制作一个监视程序用于检查线程是否已经停止并重启它们。
这种行为从线程和Python本身的角度来看是有意义的,但使我的工作更加困难。因此我使用字典实现了一种解决方案,将初始线程存储到一个新对象中并在必要时启动它。不幸的是,这也行不通。 以下是一个基本示例:
起初,我尝试只是检查线程是否还活着并重启它,这样做:
>>> if not a_thread.isAlive():
... a_thread.start()
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "c:\Python34\lib\threading.py", line 847, in start
raise RuntimeError("threads can only be started once")
RuntimeError: threads can only be started once
这种行为从线程和Python本身的角度来看是有意义的,但使我的工作更加困难。因此我使用字典实现了一种解决方案,将初始线程存储到一个新对象中并在必要时启动它。不幸的是,这也行不通。 以下是一个基本示例:
import threading
import logging
import queue
import time
from copy import copy, deepcopy
def a():
print("I'm thread a")
def b():
print("I'm thread b")
# Create thread objects
thread_dict = {
'a': threading.Thread(target=a, name='a'),
'b': threading.Thread(target=b, name='b')
}
threads = [copy(t) for t in thread_dict.values()]
for t in threads:
t.start()
for i in range(len(threads)):
if not threads[i].isAlive():
temp = thread_dict[threads[i].name]
threads[i] = deepcopy(temp)
threads[i].start()
thread(i).join(5)
返回:
I'm thread a
I'm thread b
Traceback (most recent call last):
File "main_test.py", line 25, in <module>
threads[i] = deepcopy(temp)
File "c:\Python34\lib\copy.py", line 182, in deepcopy
y = _reconstruct(x, rv, 1, memo)
... (there's about 20 lines of traceback within copy)
File "c:\Python34\lib\copyreg.py", line 88, in __newobj__
return cls.__new__(cls, *args)
TypeError: object.__new__(_thread.lock) is not safe, use _thread.lock.__new__()
显然,线程
对象不可安全复制... 有没有重新启动线程的方法,而无需重新创建整个对象?