mic*_*zer 11 python multithreading
我正在尝试创建一个在后台执行操作的线程.我需要能够在需要时有效地"暂停"它,并在以后再次"恢复"它.此外,如果线程在我"暂停"它时正在做某事,它应该让调用线程等到它完成它正在做的事情.
我对Python中的多线程很新,所以我还没有那么远.
除了让调用线程等待,如果在我的线程正在执行某些操作时调用暂停,我几乎可以做的事情.
以下是我在代码中尝试实现的概述:
import threading, time
class Me(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
#flag to pause thread
self.paused = False
def run(self):
while True:
if not self.paused:
#thread should do the thing if
#not paused
print 'do the thing'
time.sleep(5)
def pause(self):
self.paused = True
#this is should make the calling thread wait if pause() is
#called while the thread is 'doing the thing', until it is
#finished 'doing the thing'
#should just resume the thread
def resume(self):
self.paused = False
Run Code Online (Sandbox Code Playgroud)
我想我基本上需要一个锁定机制,但在同一个线程内?
以下是填充骨架的示例:
class Me(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
#flag to pause thread
self.paused = False
# Explicitly using Lock over RLock since the use of self.paused
# break reentrancy anyway, and I believe using Lock could allow
# one thread to pause the worker, while another resumes; haven't
# checked if Condition imposes additional limitations that would
# prevent that. 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.pause_cond.wait()
#thread should do the thing if
#not paused
print 'do the thing'
time.sleep(5)
def pause(self):
self.paused = True
# If in sleep, we acquire immediately, otherwise we wait for thread
# to release condition. In race, worker will still see self.paused
# and begin waiting until it's set back to False
self.pause_cond.acquire()
#should just resume the thread
def resume(self):
self.paused = False
# Notify so thread will wake after lock released
self.pause_cond.notify()
# Now release the lock
self.pause_cond.release()
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
使用threading.Event而不是布尔变量,并为忙状态添加另一个事件:
def __init__(self):
...
self.can_run = threading.Event()
self.thing_done = threading.Event()
self.thing_done.set()
self.can_run.set()
def run(self):
while True:
self.can_run.wait()
try:
self.thing_done.clear()
print 'do the thing'
finally:
self.thing_done.set()
def pause(self):
self.can_run.clear()
self.thing_done.wait()
def resume(self):
self.can_run.set()
Run Code Online (Sandbox Code Playgroud)
编辑:上一个答案是错误的,我修复了它并更改了变量名称