python类中的简单线程管理

时间:2011-12-10 03:27:31

标签: python multithreading class

我正在尝试为Python编写一个模块,为我的程序输出文本,并在后台执行某些操作时显示进度条。我现在正在使用'线程'模块,但如果其他东西会让它变得更容易,那么我会接受建议。

我想知道的是两个, 我应该如何优雅地调用这个类,我应该如何阻止这些线程的创建?

这就是我目前正在做的事情:

tmp1 = textprint("hello this is text")
tmp1.start()
# do something
tmp1.stop()

到目前为止,这些是我已经考虑过的选项和looked

  • 使用thread.name查找线程的名称或拥有该线程 之后返回一个名字来杀死。或传递一个类似的数字 之后的线程识别。 (有点麻烦而不是我的 最喜欢的解决方案。)

    发送thread.event? - 从阅读文档,我看到一个事件可以 被发送,也许可以用它来阻止它?

    with声明,但我不清楚如何在这种情况下使用它,加上我发现大多数python文档非常混乱,根本不是为我写的。

喜欢做的事情是这样的:

echo('hello')(打印进度条等) - 然后当我想要阻止它echo.stop()

obv。虽然问题是stop函数不知道它试图阻止哪个线程。

这是我试图做的骨架:

import time
import string
import threading

class print_text(threading.Thread):

    def __init__(self,arg=None):
        super(print_text,self).__init__()
        self._stop = False
        self.arg=arg

    def run (self):
        # start thread for text
        print self.txt
        while not self._stop:
                print "rude words"

    def echo (self,txt):
        self.txt=txt
        self.start()

    def stop(self):
        self._stop = True

    def stopped(self):
        return self._stop == True

    def __enter__(self):
        print "woo"
        return thing

    def __exit__(self, type, value, traceback):
        return isinstance(value, TypeError)


if __name__ == '__main__':

    print_text.start.echo('this is text') # dunt werk

    with print_text.echo('this is text'):
           time.sleep(3)

    print "done"

然后像这样调用它:

echo('this is text') 

我也猜这样做我必须

import echo from print_text 

WITH做事情的方式建议放入__enter____exit__位。我尝试了它们并且它们没有工作,而且,我不知道我在做什么,非常感谢任何帮助,谢谢

3 个答案:

答案 0 :(得分:3)

在Python中停止线程的最佳方法是礼貌地要求它停止。将新数据传递给线程的最佳方法是使用Queue模块。

两者都在the code in this post中使用,它演示了来自Python线程的套接字通信,但与您的问题相关。如果您仔细阅读代码,您会注意到:

  1. 使用由外部方法调用设置的threading.Event(),并且线程会定期检查以确定是否要求它死亡。
  2. 使用Queue.Queue()将命令传递给线程并从中接收响应。

答案 1 :(得分:3)

你非常接近工作代码。只需要一些小修正:

  • print_text 是一个类。它应该使用print_text()
  • 进行实例化
  • start 方法返回 print_text 的实例,需要保存  为了在其上调用 stop echo t = print_text()
  • enter 方法需要返回 self 而不是 thing
  • 退出方法应设置 _stop 或致电 stop()
  • echo 方法应该返回 self ,以便它可以与with语句一起使用。

以下是一些包含那些次要编辑的工作代码:

import time
import string
import threading

class print_text(threading.Thread):

    def __init__(self, arg=None):
        super(print_text,self).__init__()
        self._stop = False
        self.arg=arg

    def run (self):
        # start thread for text
        print self.txt
        while not self._stop:
                print "rude words"

    def echo (self, txt):
        self.txt=txt
        self.start()
        return self

    def stop(self):
        self._stop = True

    def stopped(self):
        return self._stop == True

    def __enter__(self):
        print "woo"
        return self

    def __exit__(self, type, value, traceback):
        self._stop = True
        return isinstance(value, TypeError)


if __name__ == '__main__':

    t = print_text()
    t.echo('this is text')
    time.sleep(3)
    t.stop()

    with print_text().echo('this is text'):
        time.sleep(3)

    print "done"

答案 2 :(得分:0)

如果您可能有多个子线程同时运行同一目标并希望确保所有子线程都已停止,则线程名称很有用。这似乎是一个有用的概括,对我来说似乎并不太麻烦,但美丽在旁观者眼中:-)。以下内容:

  • 启动子线程以打印消息并启动进度条
  • 使用启动时给出的名称停止子线程。

这是更简单的代码。它能做你想做的吗?

import time, threading

class print_text:

    def __init__(self):
        pass

    def progress(self):
        while not self._stop:       # Update progress bar
            print(".", sep="", end="")
            time.sleep(.5)

    def echo(self, arg="Default"):  # Print message and start progress bar
        print(arg)
        self._stop = False
        threading.Thread(target=self.progress, name="_prog_").start()

    def stop(self):
        self._stop = True
        for t in threading.enumerate():
            if t.name == "_prog_":
                t.join()

tmp1 = print_text()
tmp1.echo("hello this is text")
time.sleep(10)
tmp1.stop()
print("Done")