使用多线程

时间:2018-01-14 20:12:45

标签: python multithreading time

我想以定时间隔重复一个功能。我遇到的问题是该函数在一个单独的线程中运行另一个函数,因此似乎没有使用我的代码。

从下面的例子中,我想每60秒重复一次function1

from multiprocessing import Process
from threading import Event

def function2(type):
    print("Function2")

def function1():
    print("Function1")
    if __name__ == '__main__':
        p = Process(target=function2, args=('type',))
        p.daemon = True
        p.start()
        p.join()

function1()

要重复该功能,我尝试使用以下代码:

class TimedThread(Thread):
    def __init__(self, event, wait_time, tasks):
        Thread.__init__(self)
        self.stopped = event
        self.wait_time = wait_time
        self.tasks = tasks

    def run(self):
        while not self.stopped.wait(0.5):
            self.tasks()

stopFlag = Event()
thread = TimedThread(stopFlag, 60, function1)
thread.start()

两个片段组合打印"功能1"在定时循环中但也会产生以下错误:

AttributeError: Can't get attribute 'function2' on <module '__main__' (built-in)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

你可以包装你的function1,如:

def main():
    while True:
        time.sleep(60)
        function1()

或者你可以让它在一个单独的线程中运行:

def main():
    while True:
        time.sleep(60)
        t = threading.Thread(target=function1)
        t.start()

答案 1 :(得分:0)

它实际上适用于我,一遍又一遍地打印Function1Function2。这两个片段是否在同一个文件中?

如果您从其他模块导入function1,则if __name__ == '__main__'检查将失败。

答案 2 :(得分:0)

我设法找到了另一种可行的解决方案。我没有使用进程,而是使用线程获得了预期的结果。两者之间的差异得到了很好的解释here

from threading import Event, Thread

    class TimedThread(Thread):
        def __init__(self, event, wait_time):
            Thread.__init__(self)
            self.stopped = event
            self.wait_time = wait_time

        def run(self):
            while not self.stopped.wait(self.wait_time):
                self.function1()

        def function2(self):
            print("Function2 started from thread")
            # Do something

        def function1(self):
            print("Function1 started from thread")
            # Do something
            temp_thread = Thread(target=self.function2)
            temp_thread.start()

    stopFlag = Event()
    thread = TimedThread(stopFlag, 60)
    thread.start()