精华内容
下载资源
问答
  • 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. ...
  • 有关这方面的更多信息,请查看thisthis在Python中,不能任意暂停线程(请记住这一点,然后再进一步阅读)。我也不确定你是否有办法在操作系统级别上做到这一点(例如使用pure-C)。您可以做的是允许线程在您事先...

    请记住,在Pythin中使用线程不会授予您并行处理,除非是IO阻塞操作。有关这方面的更多信息,请查看this和this

    在Python中,不能任意暂停线程(请记住这一点,然后再进一步阅读)。我也不确定你是否有办法在操作系统级别上做到这一点(例如使用pure-C)。您可以做的是允许线程在您事先考虑的特定点暂停。我给你举个例子:class MyThread(threading.Thread):

    def __init__(self, *args, **kwargs):

    super(MyThread, self).__init__(*args, **kwargs)

    self._event = threading.Event()

    def run(self):

    while True:

    self.foo() # please, implement this.

    self._event.wait()

    self.bar() # please, implement this.

    self._event.wait()

    self.baz() # please, implement this.

    self._event.wait()

    def pause(self):

    self._event.clear()

    def resume(self):

    self._event.set()

    这种方法可行,但:根据我给你的链接,线程通常是个坏主意。在

    使用这种方法,您必须自己编写run方法的代码。这是因为您需要控制要检查pause的确切点,这意味着要访问Thread对象(也许您想创建一个额外的方法,而不是调用self._event.wait())。在

    前一点清楚地表明,你不能随意停顿,但只要你指定了,你就可以暂停。避免在暂停点之间进行长时间操作。在

    编辑我没有测试这个线程,但是如果您需要一个以上的线程,那么这个方法可能不需要太多的子类化就可以了:

    ^{pr2}$

    这将允许您通过调用MyPausableThread(target=myfunc).start()创建一个没有更多子类化的自定义线程,并且您的可调用的第一个参数将接收thread对象,当您需要暂停检查时,可以从该对象调用self._wait_if_paused()。在

    或者更好的方法是,如果要将目标与访问线程对象隔离开来:class MyPausableThread(threading.Thread):

    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):

    self._event = threading.Event()

    if target:

    args = ((lambda: self._event.wait()),) + args

    super(MyPausableThread, self).__init__(group, target, name, args, kwargs)

    def pause(self):

    self._event.clear()

    def resume(self):

    self._event.set()

    目标callable将在第一个参数中接收一个可以这样调用的函数:pause_checker()(前提是目标可调用的第一个参数名为pause_checker)。在

    展开全文
  • 我有一个装有websockets的Tornado服务器:class SockHandler(SockJSConnection): def on_open(self, request): clients.add...但是我需要做的是在两个注释处执行命令来暂停和恢复线程。在 我应该如何实现这一点? 谢谢

    我有一个装有websockets的Tornado服务器:class SockHandler(SockJSConnection):

    def on_open(self, request):

    clients.add(self)

    def on_message(self, message):

    if (message == 'start'):

    self.send({'message' : start_msg})

    thr = threading.Thread(target=func_with_loop, args=(self.on_result,)).start()

    if (message == 'next'):

    # resume 'thr'

    def on_result(self, response):

    self.send(response)

    # pause 'thr'

    def on_error(self, e):

    print(e)

    def on_close(self):

    clients.remove(self)

    self.close()

    在UI上,我有“开始”和“下一步”按钮,它们通过套接字连接发送这些消息。在

    我在“start”创建一个线程,它触发一个运行有限循环的函数,并在每个循环中调用回调self.on_result。在

    现在工作得很好。但是我需要做的是在两个注释处执行命令来暂停和恢复线程。在

    我应该如何实现这一点?

    谢谢

    展开全文
  • Python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 对于函数中...

    Python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 对于函数中没有循环,可以使用join()来结束循环。
    其中方法之一:一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. threading中Event对象能实现此功能。

    • 对于event.isSet()可以查看event的状态,
    • set()函数返回为True,
    • clear()函数返回为False。
    • self.__flag.wait() 中self.__flag为True时立即返回, 为False时阻塞直到self.__flag为True后返回
      另一个方法是使用信号量。
        def wait(self, timeout=None):
            """Block until the internal flag is true.
            If the internal flag is true on entry, return immediately. Otherwise,
            block until another thread calls set() to set the flag to true, or until
            the optional timeout occurs.
    		阻塞, 直到内部的标志位为True时. 如果在内部的标志位在进入时为True时, 立即返回. 否则, 阻塞直到其他线程调用set()方法将标准位设为True, 或者到达了可选的timeout时间.
            When the timeout argument is present and not None, it should be a
            floating point number specifying a timeout for the operation in seconds
            (or fractions thereof).
    		当给定了timeout参数且不为None, 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。
    		此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。
            This method returns the internal flag on exit, so it will always return
            True except if a timeout is given and the operation times out.
            """
            ......
    

    利用wait的阻塞机制, 就能够实现暂停和恢复了, 再配合循环判断标识位, 就能实现退出了, 下面是代码示例:

    #!/usr/bin/python
    # coding: utf-8
    
    import threading
    import time
    
    class Job(threading.Thread):
    
      def __init__(self, *args, **kwargs):
        super(Job, self).__init__(*args, **kwargs)
        # 用于暂停线程的标识
        self.__flag = threading.Event()   
        self.__flag.set()    # 设置为True
        # 用于停止线程的标识
        self.__running = threading.Event()   
        self.__running.set()   # 将running设置为True
    
      def run(self):
        while self.__running.isSet():
          self.__flag.wait()   # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
          print time.time()
          time.sleep(1)
    
      def pause(self):
        self.__flag.clear()   # 设置为False, 让线程阻塞
    
      def resume(self):
        self.__flag.set()  # 设置为True, 让线程停止阻塞
    
      def stop(self):
        self.__flag.set()    # 将线程从暂停状态恢复, 如果已经暂停的话
        self.__running.clear()    # 设置为False  
    
    展开全文
  • 要是一个线程进行到一半,想终止了,怎么办呢?请看代码:usingSystem;usingSystem.Threading;classThreadTest{//工作线程的方法publicstaticvoidWorkerThreadMethod1(){//获得当前正在执行的线程对象Threadw1=...

    要是一个线程进行到一半,想终止了,怎么办呢?请看代码:

    usingSystem;

    usingSystem.Threading;

    classThreadTest

    {

    //工作线程的方法publicstaticvoidWorkerThreadMethod1()

    {

    //获得当前正在执行的线程对象Thread w1=Thread.CurrentThread;

            w1.Name="工人1号正在工作中

    ";

    for(inti=1; i<10;i++)

    {

                Thread.Sleep(400);

                Console.WriteLine(w1.Name);

    if(i==4)

    {

                    Console.WriteLine("累死我了,不想做了");

    //终止线程w1.Interrupt();

                }        }    }

    publicstaticvoidMain()

    {

    //用于封装工作线程的委托ThreadStart worker1=newThreadStart(WorkerThreadMethod1);

            

            Console.WriteLine("[主函数]开始创建工作线程");

            

    //新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法Thread t1=newThread(worker1);

    //启动线程t1.Start();

            

    //阻塞当前的主线程,直到t1线程终止t1.Join();

            

            

            Console.WriteLine("[主函数]工作线程结束");

            Console.ReadLine();

        }}

    输出结果是:

    [主函数]开始创建工作线程

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    累死我了,不想做了

    [主函数]工作线程结束

    如你所见,Thread.Interrupt()方法就可以让它终止。那么我不想让它终止,只是想让它暂停一下,怎么办呢?只能用Thread.Sleep(...)吗?那样不好控制,还要看时间,真麻烦,那么我们就这样:

    usingSystem;

    usingSystem.Threading;

    classThreadTest

    {

    //工作线程的方法publicstaticvoidWorkerThreadMethod1()

    {

    //获得当前正在执行的线程对象Thread w1=Thread.CurrentThread;

            w1.Name="工人1号正在工作中

    ";

    for(inti=1; i<10;i++)

    {

                Thread.Sleep(400);

                

                Console.WriteLine(w1.Name);

            }        

        }

    publicstaticvoidMain()

    {

    //用于封装工作线程的委托ThreadStart worker1=newThreadStart(WorkerThreadMethod1);

            

            Console.WriteLine("[主函数]开始创建工作线程");

            

    //新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法Thread t1=newThread(worker1);

    //启动线程t1.Start();

            

            Console.WriteLine("我要先来,你给我停下!");

            t1.Suspend();

    for(inti=1; i<6; i++)

    {

                Thread.Sleep(400);

                Console.WriteLine("这部电影真好看,享受ing

    ");

            }        Console.WriteLine("好了,我做完事了,你开始吧");

            t1.Resume();

            

            t1.Join();

            

            Console.WriteLine("[主函数]工作线程结束");

            Console.ReadLine();

        }}

    输出结果是:

    [主函数]开始创建工作线程

    我要先来,你给我停下!

    这部电影真好看,享受ing...

    这部电影真好看,享受ing...

    这部电影真好看,享受ing...

    这部电影真好看,享受ing...

    这部电影真好看,享受ing...

    好了,我做完事了,你开始吧

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    工人1号正在工作中...

    [主函数]工作线程结束

    我们用Thread.Suspend方法把指定线程暂停了,然后可以用Thread.Resume方法恢复。

    注意一下Sleep方法跟Suspend方法的差异吧:

    1.Suspend方法没有参数,被它终止的线程只能被另一个线程恢复执行(同过Thread.Resume方法)。(相对应的,Sleep方法要是传递Timeout.Infinite值,那么不能恢复了,只能让另一个线程调用被暂停线程的Thread.Interrupt方法使它终止)

    2.可以在当前执行的线程上或者另一个线程上调用Thread.Suspend方法,而Thread.Sleep方法只能在当前线程上调用。

    (所以我们把t1.Suspend()语句去掉,加到WorkerThreadMethod1里

    如下所示:

    //获得当前正在执行的线程对象Thread w1=Thread.CurrentThread;

            w1.Name="工人1号正在工作中

    ";

            w1.Suspend();

    效果跟本来是一样的

    )

    3.当一个线程使用Suspend方法暂停另一个线程时,第一个线程不被锁定。调用立即返回。

    另外,无论对一个给定的线程调用多少次Thread.Suspend方法,调用一次Thread.Resume方法就可使线程恢复执行。

    展开全文
  • 有关这方面的更多信息,请查看thisthis你不能在Python中任意暂停一个线程(在进一步阅读之前请记住这一点).我不确定你是否有办法在操作系统级别(例如使用pure-C).您可以做的是允许线程在您事先考虑的特定点暂停.我会...
  • python线程暂停

    2020-12-16 00:57:16
    Python基础系列讲解——线程锁Lock的使用介绍我们知道Python线程是封装了底层操作系统的线程,在Linux系统中是Pthread(全称为POSIX Thread),在Windows中是Windows Thread。因此Python线程是完全受操作系统的...
  • 原博文2016-12-05 10:31 −我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后...
  • python 线程 暂停, 恢复, 退出我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦...
  • 暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到threading中Event对象的wait方法的描述时. 笔记链接如下: https://www.cnblogs.com/scolia/p/6132950.htmlhttps:...
  • 本人自行学 python 完全是网络教程 很多没有费解地方也没人交流 见谅 找了很多 多线程相关 发现都是...循环方式 还必须是 while 如果 使用for 是无法 暂停 恢复 停止的 此 gui 适应也与 tkinter & PySimpleGUI 两者
  • Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号接触。 Event对象实现了简单的线程通信机制,它提供了设置信号,清除信号,等待等用于实现线程间的通信...
  • 将进程挂起(Suspend) 而非 阻塞(Block)如果用sleep() 进程将阻塞假设进程下有两个线程 那么这两个线程会继续运行要使进程挂起...#恢复进程为了证明效果 我写了一个简单的进程Process其下有两个线程 读者Reader 写...
  • 停止、暂停和恢复python解释器

    千次阅读 2019-04-18 22:12:45
    经过前面的一系列铺垫,现在要迎来我们的终极成果了——在运行我们自定义的函数过程中,如果要停止、暂停和恢复python解释器,应该如何操作呢? 如果自定义函数中有耗时操作应该如何处理呢? 如何通过python c ...
  • 不,通常异步运行在单线程中。在How asyncio package enables bar, to be an async task, with thesekeywords, under the hood?当您将函数定义为async时,此函数将成为生成器,允许使用__next__()方法“分步”执行它...
  • In Python 2, use of Lock instead of RLock also # boosts performance. self.pause_cond = threading.Condition(threading.Lock()) def run(self): while True: with self.pause_cond: while self.paused: self....
  • 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,253
精华内容 2,901
关键字:

python线程暂停和恢复

python 订阅