2015-12-29 4 views
1

У меня есть несколько потоков, которые запускают цикл while. Я хотел бы прекратить эти потоки через определенное количество времени. Мне известны другие вопросы, подобные этому, но я не вижу, как я могу передать эти ответы на мой код.Как прекратить поток в python через определенное количество времени?

def function1(arg1, arg2, arg3, duration): 
     t_end = time.time() + duration 
     while time.time() < t_end: 
      #do some stuff 

for i in range(100): 
    t = Thread(target = function1, args=(arg1, arg2, arg3, 10)) 
    t.start() 

Это открывает 100 нитей, но они никогда не закрываются. Как закрыть эти потоки после указанного времени, в этом примере 10 секунд? Моя функция открывает сокет.

+0

Ваш пример имеет неопределенную переменную: 'TIME'. Пожалуйста, предоставьте краткую полную программу, которую мы можем запустить. Скажите, каков ожидаемый и фактический результат вашей программы. См. [Mcve] и [ask] для получения дополнительной информации. –

+0

Извините, что неопределенная переменная TIME должна была быть длительностью, вопрос был отредактирован. Вам все еще нужна короткая полная программа? @Rob –

+0

Да, MCVE все равно будет полезен. Он продемонстрировал бы, например, какую «тему» ​​вы используете, и именно то, что вы подразумеваете под «никогда не закрывать». –

ответ

1

Используйте смесь завершения нити (информация найдена здесь: Is there any way to kill a Thread in Python?)

и нарезание резьб таймера объектов: https://docs.python.org/2/library/threading.html#timer-objects

ниже код работает для меня, но тот факт, что продолжает бросать TypeError попал мне озадаченный. Я не могу найти много информации о том, почему это происходит и как предотвратить это:

threadingtest.py

#!/usr/bin/env python3 
import time 
import threading 

class StoppableThread(threading.Thread): 
    """Thread class with a stop() method. The thread itself has to check 
    regularly for the stopped() condition.""" 

    def __init__(self): 
     super(StoppableThread, self).__init__() 
     self._stop = threading.Event() 

    def stop(self): 
     self._stop.set() 
     try: 
      self.join() 

     except TypeError as tE: 
      print("Shutting down") 

    def stopped(self): 
     return self._stop.isSet() 

class MyStoppableThread(StoppableThread): 

    def __init__(self, *args): 
     super(MyStoppableThread, self).__init__() 
     self.args = args # Use these in the thread 

    def run(self): 
     print("Started my thread with arguments {}".format(self.args)) 
     while not self.stopped(): 
      time.sleep(1) 
      # THIS IS WHERE YOU DO THINGS 

if __name__ == "__main__": 
    threads = [] 
    for i in range(100): 
     t = MyStoppableThread(i, 'a', 'b', 'c') 
     t.start() 
     threads.append(t) 

    print("\n:: all threads created\n") 
    time.sleep(5) 
    print("\n:: killing all threads\n"); 
    for t in threads: 
     t.stop() 
1

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

threadlist = {} 
def cb(id, currtime): 
    t = threadlist[id] 
    d = currtime - t.starttime 
    if d > 10: 
     return True 
    else: 
     return False 

def function1(arg1, arg2, arg3, duration, cb, threadid): 
    t_end = time.time() + duration 
    while time.time() < t_end: 
     #do some stuff 
     if cb(threadid, time.time()): 
      break 

for i in range(100): 
    t = Thread(target = function1, args=(arg1, arg2, arg3, 10, cb, i)) 
    threadlist[id] = {"starttime": time.time(), "thread": t} 
    t.start() 

И проверить:

time.sleep(15) 
for item in threadlist.values(): 
    print(item.thread.is_alive()) 
+0

Это, похоже, не работает для моей программы. Я считаю, что причина в том, что моя функция открывает сокет. Как я могу исправить эту проблему? –

+0

внутри цикла while программа должна быть в том же контексте, что и сокет. Таким образом, вы можете закрыть его, а затем вернуться вместо просто перерыва. Мне понадобится более полная картина кода, чтобы дать вам лучший ответ. – jmunsch

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