我有一个很长的进程,我计划在一个线程中运行,否则它将冻结我的wxpython应用程序中的ui。
我正在使用
threading.Thread(target = myLongProcess).start()
启动线程并且它可以工作,但我不知道如何暂停和恢复线程。我在python文档中查找了上述方法,但无法找到它们。
有人可以建议我怎么做吗?
谢谢。
答案 0 :(得分:12)
我自己也有同样的问题,直到找到答案。
我也进行了一些速度测试,在缓慢的2处理器Linux机箱上设置标志和采取行动的时间快得多0.00002秒。
作者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())