产卵线程并阻止它们

时间:2018-04-20 01:31:22

标签: python multithreading

我现在已经阅读了几个小时的线程,而我正在做其他人没有的事情。大多数人正在实现一个线程并试图让线程停止。相反,正如您所看到的,下面的类产生了所请求的调用给定函数的线程数。这将允许调用者编写一个函数来说明在数据库中创建记录,并且他们有N个用户执行测试。我不想让我的用户自己创建线程。我遇到的问题是停止用户线程,因为他们将编写将保留在创建记录的while循环内部的代码。我如何杀死线程? t.kill_received = True适用于我的另一个测试,但是对于这个新案例并不适用。这不是生产代码。

class FMpuThread( ):
    def __init__( self,threadCount, function, results ):
        self.count      = threadCount
        self.func       = function
        self.results    = results
        print 'count: ' + str( self.count ) + ' func: ' + str( function )

    def DoTest( self ):
        threads = []

        # Create correct thread count
        for threadId in range(self.count):
            print 'Starting thread: ' + str(self.func.__name__) + '(' + str( threadId ) + ')'
            t = Thread(target=self.func, args=( threadId, self.results ))
            threads.append( t )
            t.mStop = False
            t.start( )
            ti.Sleep(.2)        # wait to start next thread

        while len(threads) > 0:
            try:    # Join threads with timeout(don't block)
                threads = [t.join(1000) for t in threads if t is not None and t.isAlive()]
            except KeyboardInterrupt:
                print 'Cancelling all threads.  Could take a few seconds.'
                for t in threads:
                    t.mStop = True
                sys.exit(0)

1 个答案:

答案 0 :(得分:0)

这是tdelaney的想法!谢谢!

好的,这是基本的想法。您希望让另一个类运行x个线程,并且您希望它们都执行相同的操作。您创建一个要调用的函数。该函数执行您想要的操作。这个函数可能有一个while循环,如果有人在Ctrl-C中输入,那么线程spawner类想要控制它。您获取当前线程并询问该线程是否应该继续。当spawner想要停止时,mStop设置为True。

def someFunc( threadID, results ):  
      ct  = threading.currentThread()

      while ct.mStop == False:
        # Do something here
        # Pause( 5 )
        # print 'Thread: ' + str( threadID )

    results[threadID] = totalRecieved


clientCount = 5
results = [None] * clientCount  # initalize entire array
fmThread = FMpuThread( rest, clientCount, tThreadBurner, results )

您需要使用请求的线程计数初始化结果,否则您将在Ctrl-C之后获得断言。

享受!!