Python 使用线程类暂停线程

Python 使用线程类暂停线程,python,multithreading,wxpython,Python,Multithreading,Wxpython,我计划在一个线程中运行一个很长的进程,因为否则它将冻结我的wxpython应用程序中的ui 我正在使用 threading.Thread(target = myLongProcess).start() 启动线程并运行,但我不知道如何暂停和恢复线程。我在python文档中查找了上述方法,但没有找到它们 有人能建议我怎么做吗 谢谢。您可以使用以下信号: 为了避免使用信号,您可以使用令牌传递系统。如果您想从主UI线程暂停它,您可能只需要使用Queue.Queue对象与它通信 只需在队列中弹出一条消息

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

我正在使用

threading.Thread(target = myLongProcess).start()
启动线程并运行,但我不知道如何暂停和恢复线程。我在python文档中查找了上述方法,但没有找到它们

有人能建议我怎么做吗

谢谢。

您可以使用以下信号:

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

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


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

其他线程没有强制暂停线程的方法(就像其他线程终止该线程的方法一样)——目标线程必须通过偶尔检查适当的“标志”来配合(a
threading.Condition
可能适用于暂停/取消暂停情况)


如果您使用的是unix-y平台(基本上不是windows),则可以使用
多处理
而不是
线程
——这样功能更强大,可以向“其他进程”发送信号;应该无条件暂停进程并继续它(如果您的进程在暂停之前需要做一些正确的事情,那么也要考虑其他进程可以捕获的信号来执行这些预暂停任务。(可能有办法在Windows上获得相同的效果,但我不了解它们,如果有的话)。
据我所知,没有与POSIX/pthread等效的线程。此外,我无法确定线程句柄/ID是否等效。Python也存在潜在问题,因为它的调度是使用本机调度器完成的,因此它不太可能期望线程挂起,特别是当线程在持有GIL时挂起,以及其他pos时sibilities.

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

在wxPython IRC频道上,我们有几个同事尝试了多处理,他们说这很有效。不幸的是,我还没有看到任何人写出了一个关于多处理和wxPython的好例子

如果您(或此处的任何其他人)提出了一些建议,请将其添加到wxPython wiki页面上的线程:


不管怎样,您都可能想查看该页面,因为它有几个使用线程和队列的有趣示例。

在找到答案之前,我自己也遇到过同样的问题

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

使用set()和clear()事件的线程暂停测试示例 里希·奥里根


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

e、 g

周一、周二、周三、周四、周五、周六、周日=范围(7)#列举一周中的几天
线程1:
def运行(自):
虽然不是自动退出:
尝试:
localtime=time.localtime(time.time())
#评估库存
如果localtime.tm_hour>16或localtime.tm_wday>FRI:
#做点什么
通过
其他:
打印('等待评估股票…')
时间。睡眠(1800)
除:
打印(traceback.format_exc())
线程2
def运行(自):
虽然不是自动退出:
尝试:
localtime=time.localtime(time.time())

如果localtime.tm_hour>=9且localtime.tm_hour否,则无法向线程发送信号——仅向进程发送信号!而
信号。暂停
仅表示调用进程在收到信号之前处于休眠状态,这对OP的请求没有用。有关正确方法,请参阅我的答案。@Alex-感谢您的澄清。我的响应中的信号部分是it’这是事后考虑..干杯:)不幸的是,我的目标是windows,因此我认为我无法使用多处理。我不希望一个线程暂停另一个线程,我只想向该线程发送一条消息,告诉它暂停自己(或者这与告诉一个线程暂停另一个线程是同一回事?),这可以通过调整线程类来完成吗?“发送消息”可以通过队列来完成,但是(如我所说)对于有条件的情况更实际。但是目标线程必须定期检查条件(或队列)以接收“消息”:您无法“强制”它“接收消息”,您必须以这种方式显式地对其进行编码(可能是w/a循环)。其他线程无法强制使线程“接收针对它的消息”,以您喜欢的术语强制转换my a的第一句话。顺便说一句,Windows确实有一个
SuspendThread
API(续)对于特定于Windows的解决方案,请参阅--您可以使用
ctypes
或直接从Python调用Windows API。为了回答这个问题,您可能需要一个对象thread\u resume=threading.Event(),然后是thread\u resume.set()。在线程中,您可以选中thread\u resume.wait()在方便的时候。如果另一个线程调用thread_resume.clear(),该线程将暂停,并在另一个线程调用thread_resume.set()时恢复。这些是我见过的最激动人心的注释和输出字符串。但是,
我刚刚设置的标志
应该在
e.set()之后。
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)
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())