убить функцию через определенное время в Windows

Я прочитал много сообщений об использовании потоков , подпроцессы и т. д. Многие из них кажутся слишком сложными для того, что я пытаюсь сделать ...

Все, что я хочу сделать, это прекратить выполнение функции по истечении X времени.

def big_loop(bob):
    x = bob
    start = time.time()
    while True:
        print time.time()-start

Эта функция - это бесконечный цикл, который никогда не вызывает ошибок или исключений, точка. Я не уверен в разнице между «командами, оболочками, подпроцессами, потоками и т. Д.» И этой функцией, поэтому у меня проблемы с манипулированием подпроцессами.

Я нашел здесь этот код и попробовал его, но как вы можете видеть, что он продолжает печатать по прошествии 10 секунд:

import time
import threading
import subprocess as sub
import time

class RunCmd(threading.Thread):
    def __init__(self, cmd, timeout):
        threading.Thread.__init__(self)
        self.cmd = cmd
        self.timeout = timeout

    def run(self):
        self.p = sub.Popen(self.cmd)
        self.p.wait()

    def Run(self):
        self.start()
        self.join(self.timeout)

        if self.is_alive():
            self.p.terminate()
            self.join()

def big_loop(bob):
    x = bob
    start = time.time()
    while True:
        print time.time()-start

RunCmd(big_loop('jimijojo'), 10).Run()  #supposed to quit after 10 seconds, but doesn't
x = raw_input('DONEEEEEEEEEEEE')

Какой простой способ отключить эту функцию? Как вы можете видеть в моей попытке выше, она не завершается через 20 секунд, а просто продолжает работать ...

*** Ой также, я читал об использовании сигнала, но я работаю в Windows, поэтому я не могу использовать функцию будильника .. (python 2.7)

** предполагаю "бесконечно работающую функцию" нельзя манипулировать или изменить так, чтобы она не была бесконечной, если бы я мог изменить функцию, я бы просто изменил ее на небесконечную, не так ли?

Вот несколько похожих вопросов, которых у меня нет 'Я могу портировать свой код для работы с моей простой функцией: Может быть, вы сможете?

Python: убить или завершить подпроцесс по истечении времени ожидания

замена signal.alarm в Windows [Python]

Хорошо, я попробовал полученный ответ, он работает .. но как я могу его использовать, если я удалить оператор if __name__ == "__main __": ? Когда я удаляю этот оператор, цикл никогда не заканчивается, как раньше.

import multiprocessing
import Queue
import time


def infinite_loop_function(bob):
    var = bob
    start = time.time()
    while True:
        time.sleep(1)
        print time.time()-start
    print 'this statement will never print'

def wrapper(queue, bob):
    result = infinite_loop_function(bob)
    queue.put(result)
    queue.close()



#if __name__ == "__main__":

queue = multiprocessing.Queue(1) # Maximum size is 1
proc = multiprocessing.Process(target=wrapper, args=(queue, 'var'))
proc.start()

# Wait for TIMEOUT seconds
try:
    timeout = 10
    result = queue.get(True, timeout)
except Queue.Empty:
    # Deal with lack of data somehow
    result = None
finally:
    proc.terminate()

print 'running other code, now that that infinite loop has been defeated!'
print 'bla bla bla'
x = raw_input('done')

7
задан Community 23 May 2017 в 12:13
поделиться