我正在尝试为Python编写一个模块,为我的程序输出文本,并在后台执行某些操作时显示进度条。我现在正在使用'线程'模块,但如果其他东西会让它变得更容易,那么我会接受建议。
我想知道的是两个, 我应该如何优雅地调用这个类,我应该如何阻止这些线程的创建?
这就是我目前正在做的事情:
tmp1 = textprint("hello this is text")
tmp1.start()
# do something
tmp1.stop()
到目前为止,这些是我已经考虑过的选项和looked:
使用thread.name查找线程的名称或拥有该线程 之后返回一个名字来杀死。或传递一个类似的数字 之后的线程识别。 (有点麻烦而不是我的 最喜欢的解决方案。)
发送thread.event? - 从阅读文档,我看到一个事件可以 被发送,也许可以用它来阻止它?
或with声明,但我不清楚如何在这种情况下使用它,加上我发现大多数python文档非常混乱,根本不是为我写的。
我喜欢做的事情是这样的:
echo('hello')
(打印进度条等)
- 然后当我想要阻止它echo.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__
位。我尝试了它们并且它们没有工作,而且,我不知道我在做什么,非常感谢任何帮助,谢谢
答案 0 :(得分:3)
在Python中停止线程的最佳方法是礼貌地要求它停止。将新数据传递给线程的最佳方法是使用Queue
模块。
两者都在the code in this post中使用,它演示了来自Python线程的套接字通信,但与您的问题相关。如果您仔细阅读代码,您会注意到:
threading.Event()
,并且线程会定期检查以确定是否要求它死亡。Queue.Queue()
将命令传递给线程并从中接收响应。答案 1 :(得分:3)
你非常接近工作代码。只需要一些小修正:
print_text()
t = print_text()
以下是一些包含那些次要编辑的工作代码:
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")