2016-10-21 3 views
0

Здравствуйте, у меня возникла проблема с потоками Python.Динамическая Threading

То, что я намереваюсь сделать, это создать функцию, которая запускает другие функции в виде потока при вызове. К сожалению, я сталкиваюсь с двумя проблемами (кроме того, что у меня недостаточно знаний в Python.)

1: Если я помещаю кавычки вокруг: "globals()[T_Name[i]]()", он обрабатывает его как строку и обычно выполняет код. 2: Если я опускаю кавычки около globals()[T_Name[i]](), он немедленно запускает первую функцию и не обрабатывает оставшуюся часть скрипта, чтобы запустить ее как поток.

Если кто-нибудь может дать некоторую проницательность, я приношу свои извинения за форматирование, я в конце концов буду подбрасывать его до стандартов PEP 8.

Код:

import threading 
import time 

T_Name=("Write_Done", "Write_Pin") 
T_Time=[] 
Tr=[] 
for i, Nu in enumerate(T_Name): 
    Tr.append("T" + str(i)) 
    T_Time.append("0") 

def Write_Done(): 
    while True: 
     print("Done") 
     time.sleep(5) 

def Write_Pin(): 
    while True: 
     print("Pin") 
     time.sleep(15) 

def Thread_Checker(): 
    while True: 
     time.sleep(5) 
     for i, TH in enumerate(T_Time): 
      if (time.time() - int(TH)) < 30: 
       pass 
       #thread is still rocking 
      else: 
       #thread has failed Time to get her done. 
       Tr[i] = threading.Thread(target=("globals()[T_Name[i]]()")) 
       print("starting" + T_Name[i]) 
       Tr[i].daemon = True 
       Tr[i].start() 
     print("Test if alive") 
     if Tr[0].is_alive(): 
      print("I LIVE!") 
     else: 
      print("I ded") 

Thread_Checker() 

ответ

0

Используйте функцию лямбды, чтобы создать что-то, что на самом деле вызываемые в качестве цели, но Задерживает вызов того, что вы хотите, пока цель не будет вызвана.

Tr[i] = threading.Thread(target=lambda: globals()[T_Name[i]]()) 
+0

Внедрение силы Лямбда –

+0

Реализация Лямбда теперь дает мне недействительную ключевую ошибку. Как раньше я не мог вызвать функцию. –

+0

Но это, по крайней мере, происходит в новой теме? Проверьте, что он теперь в потоке, и если да, то теперь вы переходите к следующей проблеме с вашим кодом, что бы это ни было. У вас есть ответ о том, как он должен быть в ните, по крайней мере. –