0

那么我的问题如下。我有一个脚本,我想在其中运行 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 中设置的时间。有人可以通过向我解释我做错了什么以及如何改正吗?

提前致谢。

4

2 回答 2

2

当我执行代码时,只有第一个线程 (f1) 永远执行,实际上没有等待 Timer 中设置的时间。

听起来第一个线程已启动,它产生了一个新的 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 秒运行一次。

于 2013-09-02T14:33:19.650 回答
0

下面的代码对我有用。你确定#do stuffinf1不是罪魁祸首吗?

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,))
于 2013-09-02T13:56:36.837 回答