Terminate a multi-thread python program

前端 未结 7 797
猫巷女王i
猫巷女王i 2020-12-02 16:17

How to make a multi-thread python program response to Ctrl+C key event?

Edit: The code is like this:

import threading
current = 0

c         


        
7条回答
  •  广开言路
    2020-12-02 17:07

    A Worker might be helpful for you:

    #!/usr/bin/env python
    
    import sys, time
    from threading import *
    from collections import deque
    
    class Worker(object):
        def __init__(self, concurrent=1):
            self.concurrent = concurrent
            self.queue = deque([])
            self.threads = []
            self.keep_interrupt = False
    
        def _retain_threads(self):
            while len(self.threads) < self.concurrent:
                t = Thread(target=self._run, args=[self])
                t.setDaemon(True)
                t.start()
                self.threads.append(t)
    
    
        def _run(self, *args):
            while self.queue and not self.keep_interrupt:
                func, args, kargs = self.queue.popleft()
                func(*args, **kargs)
    
        def add_task(self, func, *args, **kargs):
            self.queue.append((func, args, kargs))
    
        def start(self, block=False):
            self._retain_threads()
    
            if block:
                try:
                    while self.threads:
                        self.threads = [t.join(1) or t for t in self.threads if t.isAlive()]
                        if self.queue:
                            self._retain_threads()
                except KeyboardInterrupt:
                    self.keep_interrupt = True
                    print "alive threads: %d; outstanding tasks: %d" % (len(self.threads), len(self.queue))
                    print "terminating..."
    
    
    # example
    print "starting..."
    worker = Worker(concurrent=50)
    
    def do_work():
        print "item %d done." % len(items)
        time.sleep(3)
    
    def main():
        for i in xrange(1000):
            worker.add_task(do_work)
        worker.start(True)
    
    main()
    print "done."
    
    # to keep shell alive
    sys.stdin.readlines()
    

提交回复
热议问题