我想以定时间隔重复一个功能。我遇到的问题是该函数在一个单独的线程中运行另一个函数,因此似乎没有使用我的代码。
从下面的例子中,我想每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)
非常感谢任何帮助。
答案 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)
它实际上适用于我,一遍又一遍地打印Function1
和Function2
。这两个片段是否在同一个文件中?
如果您从其他模块导入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()