使用线程类暂停线程

时间:2010-07-16 06:13:04

标签: python multithreading wxpython

我有一个很长的进程,我计划在一个线程中运行,否则它将冻结我的wxpython应用程序中的ui。

我正在使用

threading.Thread(target = myLongProcess).start()

启动线程并且它可以工作,但我不知道如何暂停和恢复线程。我在python文档中查找了上述方法,但无法找到它们。

有人可以建议我怎么做吗?

谢谢。

6 个答案:

答案 0 :(得分:12)

我自己也有同样的问题,直到找到答案。

我也进行了一些速度测试,在缓慢的2处理器Linux机箱上设置标志和采取行动的时间快得多0.00002秒。

使用set()&的示例线程暂停测试clear()事件

作者Rich O'Regan

import threading
import time

# This function gets called by our thread.. so it basically becomes the thread innit..                    
def wait_for_event(e):
    while True:
        print '\tTHREAD: This is the thread speaking, we are Waiting for event to start..'
        event_is_set = e.wait()
        print '\tTHREAD:  WHOOOOOO HOOOO WE GOT A SIGNAL  : %s', event_is_set
        e.clear()

# Main code.. 
e = threading.Event()
t = threading.Thread(name='your_mum', 
                     target=wait_for_event,
                     args=(e,))
t.start()

while True:
    print 'MAIN LOOP: still in the main loop..'
    time.sleep(4)
    print 'MAIN LOOP: I just set the flag..'
    e.set()
    print 'MAIN LOOP: now Im gonna do some processing n shi-t'
    time.sleep(4)
    print 'MAIN LOOP:  .. some more procesing im doing   yeahhhh'
    time.sleep(4)
    print 'MAIN LOOP: ok ready, soon we will repeat the loop..'
    time.sleep(2)

答案 1 :(得分:8)

没有其他线程强制暂停线程的方法(除了其他线程杀死该线程之外) - 目标线程必须通过偶尔检查相应的“标志”(threading.Condition来配合可能适合暂停/取消暂停的情况。)

如果您使用的是unix-y平台(基本上只有Windows),您可以使用multiprocessing代替threading - 更强大,并允许您向“其他过程”发送信号; SIGSTOP应该无条件地暂停一个进程并SIGCONT继续它(如果你的进程需要在它暂停之前做一些事情,还要考虑SIGTSTP信号,其他进程可以捕获它暂停前的职责。(可能有办法在Windows上获得相同的效果,但我不了解它们,如果有的话)。

答案 2 :(得分:2)

您可以使用信号:http://docs.python.org/library/signal.html#signal.pause

为避免使用信号,您可以使用令牌传递系统。如果你想从主UI线程暂停它,你可能只需使用Queue.Queue对象与它进行通信。

只需弹出一条消息,告诉线程在队列中休眠一段时间。

或者,您可以简单地从主UI线程连续将令牌推送到队列中。工人应该每N秒检查一次队列(0.2或类似的东西)。当没有令牌出队时,工作线程将阻塞。当你想要它再次启动时,只需再次从主线程开始将令牌推送到队列。

答案 3 :(得分:2)

多处理模块在Windows上运行正常。请参阅此处的文档(第一段末尾):

http://docs.python.org/library/multiprocessing.html

在wxPython IRC频道上,我们有几个人尝试多处理,他们说它有效。不幸的是,我还没有看到有人写过多处理和wxPython的好例子。

如果您(或此处的任何其他人)提出了某些建议,请将其添加到wxPython维基页面上的线程:http://wiki.wxpython.org/LongRunningTasks

您可能想要检查该页面,因为它有几个使用线程和队列的有趣示例。

答案 4 :(得分:1)

您可以查看Windows API for thread suspension

据我所知,没有相应的POSIX / pthread。此外,我无法确定线程句柄/ ID是否为made available from Python。 Python也存在潜在的问题,因为它的调度是使用本机调度程序完成的,它不太可能期望线程暂停,特别是如果线程在持有GIL时暂停,以及其他可能性。

答案 5 :(得分:1)

我有同样的问题。在线程循环中使用time.sleep(1800)来暂停线程执行会更有效。

例如

MON, TUE, WED, THU, FRI, SAT, SUN = range(7) #Enumerate days of the week
Thread 1 : 
def run(self):
        while not self.exit:
            try:
                localtime = time.localtime(time.time())
                #Evaluate stock
                if localtime.tm_hour > 16 or localtime.tm_wday > FRI:
                    # do something
                    pass
                else:
                    print('Waiting to evaluate stocks...')
                    time.sleep(1800)
            except:
                print(traceback.format_exc())

Thread 2
def run(self):
    while not self.exit:
        try:
            localtime = time.localtime(time.time())
            if localtime.tm_hour >= 9 and localtime.tm_hour <= 16:
                # do something
                pass
            else:
                print('Waiting to update stocks indicators...')
                time.sleep(1800)
        except:
            print(traceback.format_exc())