使用线程类暂停线程

2024-04-19 11:20:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我在用

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

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

有人能建议我怎么做吗?

谢谢你。


Tags: 方法文档应用程序uitarget进程wxpython线程
3条回答

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

我也做了一些速度测试,设置标志和采取行动的时间是愉快的快速0.00002秒在一个缓慢的2处理器Linux盒。

使用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)

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

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

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

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

其他线程没有方法强制暂停某个线程(与其他线程终止该线程的方法相同),目标线程必须通过偶尔检查适当的“标志”来进行协作(对于暂停/取消暂停情况,threading.Condition可能是适当的)。

如果您在一个unix-y平台上(基本上除了windows以外的任何平台),可以使用multiprocessing,而不是threading--它的功能要强大得多,并且允许您向“另一个进程”发送信号;SIGSTOP应该无条件地暂停一个进程,然后SIGCONT继续它(如果您的进程需要在暂停之前做点什么,也可以考虑一下SIGTSTP信号,另一个进程可以捕获该信号以执行此类暂停前的任务。(可能有办法在窗户上获得同样的效果,但我对它们并不了解,如果有的话)。

相关问题 更多 >