2016-06-30 2 views
0

Я хотел бы построить функцию, которая проверяет, работает ли уже субтитр, а если нет, запустите подпроцесс с заданной функцией и параметром. Как многопоточной инструмент я использую этот пост: Is there any way to kill a Thread in Python?Начать подзаголовок с произвольной функцией, включая параметры

Идея до сих пор является следующее:

from ThreadEx import ThreadEx 

class MyClass: 
    def __init__(self): 
     self.__Thread = ThreadEx(name='MyClass',target="") 
     self.GlobalVariable = "MyClass Variable" 

    def SubThread(self, function): 
     if not self.__Thread.is_alive(): 
      print("Thread is not alive") 
      self.__Thread = ThreadEx(target=function(),args=(self,)) 
      print("Thread is going to start") 
      self.__Thread.start() 
      print("Thread started") 
     else: 
      print("There is already a subthread running") 

    def MyFunction1(self, argument1, argument2, argument3): 
     self.SubThread(lambda: MyFunction1(self, argument1,argument2,argument3)) 

    def MyFunction2(self, argument1, argument2): 
     self.SubThread(lambda: MyFunction2,argument1,argument2) 


def MyFunction1(self, argument1, argument2, argument3): 
    print(self.GlobalVariable) 
    print("MyFunction1") 
    print("Argument1: " + str(argument1)) 
    print("Argument2: " + str(argument2)) 
    print("Argument3: " + str(argument3)) 

def MyFunction2(argument1, argument2): 
    print("MyFunction2") 
    print("Argument1: " + str(argument1)) 
    print("Argument2: " + str(argument2)) 

, к сожалению, если я исполню:

from Myclass import MyClass 

self.MyClass = MyClass() 
self.MyClass.MyFunction1("Test1","Test2","Test3") 

Выход:

Thread is not alive 
MyClass Variable 
MyFunction1 
Argument1: Test1 
Argument2: Test2 
Argument3: Test3 
Thread is going to start 
Thread started 

Таким образом, функция выполняется до начала потока. Поэтому мой вопрос заключается в том, как отправить MyFunction, включая все аргументы в subthread, и возможность повторять это с помощью любой другой функции без необходимости писать процедуру каждый раз. Я уже искал * args и ** kwargs, но я не мог найти правильный синтаксис, иначе это было неправильно.

Заранее благодарен! :)

ответ

0

Ваша проблема эта линия:

self.__Thread = ThreadEx(target=function(),args=(self,)) 

Обратите внимание на круглые скобки позади функции. Это означает, что функция не назначена цели, но результат вызывает указанную функцию. Таким образом, функция выполняется, она выполняет печать и т. Д., затем его вывод (None) присваивается target, а затем начинается поток.

ли это вместо:

self.__Thread = ThreadEx(target=function,args=(self,)) 

Чем больше общая альтернатива этим лямбды является использование *args и **kwargs, как вы уже. Он должен выглядеть следующим образом:

class MyClass: 
    # ... other class code goes here 
    def SubThread(self, function, *args, **kwargs): # changed 
    if not self.__Thread.is_alive(): 
     print("Thread is not alive") 
     self.__Thread = ThreadEx(target=function,args=args, kwargs=kwargs) # changed 
     print("Thread is going to start") 
     self.__Thread.start() 
     print("Thread started") 
    else: 
     print("There is already a subthread running") 

    def MyFunction1(self, argument1, argument2, argument3): 
    self.SubThread(MyFunction1, self, argument1, argument2, argument3) # changed, note explicit inclusion of self 

# ... function code goes here 

my_instance = MyClass() 
my_instance.MyFunction1("Test1","Test2","Test3") 
my_instance.SubThread(MyFunction1, my_instance, "Test1", "Test2", "Test3") # note explicit inclusion of my_instance 
+0

Переход к себя .__ темы = ThreadEx (целевых = функция, арг = (сам)) не получилось, но общая альтернатива решает проблему очень хорошо! Благодаря! – Marc

Смежные вопросы