对不起,老问题。我已经澄清了。我如何用我可怜的线程类开始停止线程?
编辑:它在循环中,我想在代码开头再次重新启动它。我如何启动停止重新启动?
我的班级:
import threading
class Concur(threading.Thread):
def __init__(self):
self.stopped = False
threading.Thread.__init__(self)
def run(self):
i = 0
while not self.stopped:
time.sleep(1)
i = i + 1
在主代码中,我希望:
inst = Concur()
while conditon:
inst.start()
#after some operation
inst.stop()
#some other operation
Stop()
的实现如下:
def stop(self):
self.stopped = True
如果您想重新启动,那么您可以创建一个新实例并启动它。
while conditon:
inst = Concur()
inst.start()
#after some operation
inst.stop()
#some other operation
Thread的留档清楚地表明,类的每个实例只能调用start()
方法一次。
如果要暂停并恢复线程,则需要使用条件变量。
这就是大卫·赫弗南的想法。下面的示例运行1秒,然后停止1秒,然后运行1秒,依此类推。
import time
import threading
import datetime as DT
import logging
logger = logging.getLogger(__name__)
def worker(cond):
i = 0
while True:
with cond:
cond.wait()
logger.info(i)
time.sleep(0.01)
i += 1
logging.basicConfig(level=logging.DEBUG,
format='[%(asctime)s %(threadName)s] %(message)s',
datefmt='%H:%M:%S')
cond = threading.Condition()
t = threading.Thread(target=worker, args=(cond, ))
t.daemon = True
t.start()
start = DT.datetime.now()
while True:
now = DT.datetime.now()
if (now-start).total_seconds() > 60: break
if now.second % 2:
with cond:
cond.notify()
您实际上不能停止然后重新启动一个线程,因为您不能在它的run()
方法终止后再次调用它的start()
方法。但是,您可以使用线程使一个停止,然后恢复执行。条件
变量,以避免检查或更改其运行状态时出现并发问题。
线程。条件
对象具有关联的线程。锁定
对象和方法以等待它被释放,并在发生这种情况时通知所有等待的线程。下面是一个从您问题中的代码派生的示例,它显示了这一点。在示例代码中,我将条件
变量作为线程
子类实例的一部分,以更好地封装实现并避免引入其他全局变量:
from __future__ import print_function
import threading
import time
class Concur(threading.Thread):
def __init__(self):
super(Concur, self).__init__()
self.iterations = 0
self.daemon = True # Allow main to exit even if still running.
self.paused = True # Start out paused.
self.state = threading.Condition()
def run(self):
self.resume()
while True:
with self.state:
if self.paused:
self.state.wait() # Block execution until notified.
# Do stuff...
time.sleep(.1)
self.iterations += 1
def pause(self):
with self.state:
self.paused = True # Block self.
def resume(self):
with self.state:
self.paused = False
self.state.notify() # Unblock self if waiting.
class Stopwatch(object):
""" Simple class to measure elapsed times. """
def start(self):
""" Establish reference point for elapsed time measurements. """
self.start_time = time.time()
return self
@property
def elapsed_time(self):
""" Seconds since started. """
try:
return time.time() - self.start_time
except AttributeError: # Wasn't explicitly started.
self.start_time = time.time()
return 0
MAX_RUN_TIME = 5 # Seconds.
concur = Concur()
stopwatch = Stopwatch()
print('Running for {} seconds...'.format(MAX_RUN_TIME))
concur.start()
while stopwatch.elapsed_time < MAX_RUN_TIME:
concur.resume()
# Can also do other concurrent operations here...
concur.pause()
# Do some other stuff...
# Show Concur thread executed.
print('concur.iterations: {}'.format(concur.iterations))
我无法停止。它的样式是。如何启动和停止圆形的小型?
问题内容: 我很难找到一种方法来启动,停止和重新启动Java中的线程。 具体来说,我在中有一个类Task(当前实现)。我的主应用程序需要能够在线程上启动此任务,在需要时停止(杀死)该线程,有时还可以杀死并重新启动该线程… 我的第一次尝试是与,但我似乎找不到办法重新启动任务。当我使用任何将来的呼叫失败时,因为是“关机” … 那么,我该怎么做呢? 问题答案: 一旦线程停止,你将无法重新启动它。但是,没
问题 你要为需要并发执行的代码创建/销毁线程 解决方案 threading 库可以在单独的线程中执行任何的在 Python 中可以调用的对象。你可以创建一个 Thread 对象并将你要执行的对象以 target 参数的形式提供给该对象。 下面是一个简单的例子: # Code to execute in an independent thread import time def countdown(
问题内容: 我正在使用我的应用程序拨打电话。 一段时间后有什么办法可以终止通话?还是在ACTION_CALL开始之前设置一个计时器? 我正在使用Prasanta博客中的以下代码,但由于某些原因,导致出现以下错误。有什么建议? 无法解决 问题答案: 您的问题已被问过很多次了。简短的答案是,没有官方的方法可以做到这一点。 在一个问题中,有人建议打开飞行模式(应用程序当然需要权限才能执行此操作)。这很粗
参考 workerman手册 http://doc3.workerman.net/install/start-and-stop.html
注意Workerman启动停止等命令都是在命令行中完成的。 要启动Workerman,首先需要有一个启动入口文件,里面定义了服务监听的端口及协议。可以参考入门指引--简单开发实例部分 这里以workerman-chat为例,它的启动入口为start.php。 启动 以debug(调试)方式启动 php start.php start 以daemon(守护进程)方式启动 php start.php