kill a function after a certain time in windows

后端 未结 4 1425
暖寄归人
暖寄归人 2020-12-11 04:20

I\'ve read a lot of posts about using threads, subprocesses, etc.. A lot of it seems over complicated for what I\'m trying to do...

All I want to do is stop executin

相关标签:
4条回答
  • 2020-12-11 04:47

    Can't you just return from the loop?

    start = time.time()
    endt = start + 30
    while True:
        now = time.time()
        if now > endt:
            return
        else:
            print end - start
    
    0 讨论(0)
  • 2020-12-11 04:51

    Use the building blocks in the multiprocessing module:

    import multiprocessing
    import Queue
    
    TIMEOUT = 5
    
    def big_loop(bob):
        import time
        time.sleep(4)
        return bob*2
    
    def wrapper(queue, bob):
        result = big_loop(bob)
        queue.put(result)
        queue.close()
    
    def run_loop_with_timeout():
        bob = 21 # Whatever sensible value you need
        queue = multiprocessing.Queue(1) # Maximum size is 1
        proc = multiprocessing.Process(target=wrapper, args=(queue, bob))
        proc.start()
    
        # Wait for TIMEOUT seconds
        try:
            result = queue.get(True, TIMEOUT)
        except Queue.Empty:
            # Deal with lack of data somehow
            result = None
        finally:
            proc.terminate()
    
        # Process data here, not in try block above, otherwise your process keeps running
        print result
    
    if __name__ == "__main__":
        run_loop_with_timeout()
    

    You could also accomplish this with a Pipe/Connection pair, but I'm not familiar with their API. Change the sleep time or TIMEOUT to check the behaviour for either case.

    0 讨论(0)
  • 2020-12-11 04:51
    import os,signal,time
    cpid = os.fork()
    if cpid == 0:
      while True:
         # do stuff
    else:
      time.sleep(10)
      os.kill(cpid, signal.SIGKILL)
    

    You can also check in the loop of a thread for an event, which is more portable and flexible as it allows other reactions than brute killing. However, this approach fails if # do stuff can take time (or even wait forever on some event).

    0 讨论(0)
  • 2020-12-11 04:59

    There is no straightforward way to kill a function after a certain amount of time without running the function in a separate process. A better approach would probably be to rewrite the function so that it returns after a specified time:

    import time
    
    def big_loop(bob, timeout):
        x = bob
        start = time.time()
        end = start + timeout
        while time.time() < end:
            print time.time() - start
            # Do more stuff here as needed
    
    0 讨论(0)
提交回复
热议问题