Python计划重复多个线程

时间:2013-09-02 13:34:00

标签: python multithreading repeat

我的问题如下。我有一个脚本,我希望在不同的时间间隔内运行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中设置的时间。有人可以帮我解释一下我做错了什么,我怎么能做对?

提前致谢。

2 个答案:

答案 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,))