我的问题如下。我有一个脚本,我希望在不同的时间间隔内运行3个函数。这三个人共享一个资源。我所做的是以下(其中res是共享资源):
import threading
import thread
lock = threading.Lock()
def f1(res) :
lock.acquire()
# do stuff
time = 10.0 # this one changes each time f1 runs
lock.release()
threading.Timer(time,f1).start()
def f2(res) :
lock.acquire()
# do stuff
time = 8.0 # this one changes each time f2 runs
lock.release()
threading.Timer(time,f2).start()
def f3(res) :
lock.acquire()
# do stuff
time = 8.0 # this one changes each time f3 runs
lock.release()
threading.Timer(time,f3).start()
thread.start_new_thread(f1(res))
thread.start_new_thread(f2(res))
thread.start_new_thread(f3(res))
当我执行代码时,发生的事情是只有第一个线程(f1)永远执行,实际上没有等待Timer中设置的时间。有人可以帮我解释一下我做错了什么,我怎么能做对?
提前致谢。
答案 0 :(得分:2)
当我执行代码时,发生的事情是只有第一个线程(f1)永远执行,实际上没有等待在 计时器。
听起来第一个线程已启动,它会生成一个新的Timer线程,并且必须有一个join
,这会阻止原始线程结束,直到其子线程完成。由于该子线程产生子子线程,依此类推,原始线程永远不会结束。
只有f1执行的事实可能是因为在这一行
thread.start_new_thread(f1(res))
在将返回值传递给f1(res)
之前评估内部参数thread.start_new_thread
。所以你实际上是首先从主线程调用 f1(res)
,而不是产生一个线程来调用f1
。
此处无需使用thread
模块。您可以使用threading
模块提供的高级接口完成所需的一切。而且,行
thread.start_new_thread(f1(res))
提出
TypeError: start_new_thread expected at least 2 arguments, got 1
所以我不确定你是如何运行代码的......
这是另一种做你想做的事情(我想)。
import threading
import logging
logger = logging.getLogger(__name__)
lock = threading.Lock()
def f1():
with lock:
logger.info('f1')
threading.Timer(10, f1).start()
def f2():
with lock:
logger.info('f2')
threading.Timer(8, f2).start()
def f3():
with lock:
logger.info('f3')
threading.Timer(23, f3).start()
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,
format='[%(asctime)s %(threadName)s] %(message)s',
datefmt='%H:%M:%S')
threading.Thread(target=f1).start()
threading.Thread(target=f2).start()
threading.Thread(target=f3).start()
打印的内容如下:
[10:53:12 Thread-1] f1
[10:53:12 Thread-3] f2
[10:53:12 Thread-4] f3
[10:53:20 Thread-5] f2
[10:53:22 Thread-2] f1
[10:53:28 Thread-7] f2
[10:53:32 Thread-8] f1
[10:53:35 Thread-6] f3
[10:53:36 Thread-9] f2
C-c C-\Quit
时间戳显示f1每10秒运行一次,f2每8秒运行一次,f3每23秒运行一次。
答案 1 :(得分:0)
以下代码适合我。您确定#do stuff
中的f1
不是罪魁祸首吗?
import threading
import thread
lock = threading.Lock()
def f1(res) :
lock.acquire()
print "F1"
lock.release()
threading.Timer(1.0,f1, [res]).start()
def f2(res) :
lock.acquire()
print "F2"
lock.release()
threading.Timer(2.0,f2, [res]).start()
def f3(res) :
lock.acquire()
print "F3"
lock.release()
threading.Timer(3.0,f3, [res]).start()
thread.start_new_thread(f1, (res,))
thread.start_new_thread(f2, (res,))
thread.start_new_thread(f3, (res,))