В документации приводится поток как функция. А мне бы надо, чтобы некий объект работал параллельно системе, но получал от неё команды. Проще говоря, любой метод такого объекта должен выполняться в потоке. Но создавать для каждого метода свой поток неудобно - они будут не согласованы.
Чтобы было понятнее, наворотил такой “велосипед” (редакция 2):
import threading
import time
class ThreadClass:
class FuncObject:
def __init__(self):
self.clear()
def clear(self):
self.func = None
self.args = []
self.kwargs = {}
self.changed = False
def __init__(self, cls):
self.enable = True
self._funcObject = self.FuncObject()
self.event = threading.Event()
self.event.clear()
thread = threading.Thread(target=self._ret_func, args=(cls,))
thread.start()
def set_func(self, func, args=[], kwargs={}):
self._funcObject.func = func
self._funcObject.args = args
self._funcObject.kwargs = kwargs
self._funcObject.changed = True
self.event.set()
def _ret_func(self, cls):
obj = cls()
while(self.enable):
self.event.wait(10)
if self.event.is_set():
self.event.clear()
if self.enable == False:
break
if self._funcObject.changed:
if self._funcObject.func in cls.__dict__:
if self._funcObject.args:
cls.__dict__[self._funcObject.func](obj, *self._funcObject.args)
elif self._funcObject.kwargs:
cls.__dict__[self._funcObject.func](obj, **self._funcObject.kwargs)
else:
cls.__dict__[self._funcObject.func](obj)
self._funcObject.clear()
def stop(self):
self.enable = False
self.event.set()
if __name__ == '__main__':
class TestClass:
def a_func(self):
print "a_func"
def b_func(self, data):
print "b_func", data
a = ThreadClass(TestClass)
b = ThreadClass(TestClass)
for i in xrange(5):
a.set_func("a_func")
b.set_func("a_func")
time.sleep(0.1)
a.set_func("b_func", ("args test a: %s"%i,))
b.set_func("b_func", ("args test b",))
time.sleep(0.1)
a.set_func("b_func", kwargs={"data": "kwargs test a"})
b.set_func("b_func", kwargs={"data": "kwargs test b"})
time.sleep(0.1)
a.stop()
b.stop()
Добавлено позже: Так как ответа не нашел, то доработал это (внёс события) и пока доволен. Пока не дойдёт до GUI…