【发布时间】:2021-04-09 12:13:38
【问题描述】:
我尝试运行这段代码,其中两个线程应根据计划任务进行初始化。我只想让守护进程并行,在一定时间后打印出一个非特定的全局值。
import os
import schedule
import time
import threading
from threading import Thread
myval = 0
thrs = []
def clear():
os.system('cls' if os.name=='nt' else 'clear')
def loopfunc(t):
global myval
myval = t
clear()
print("myval=",t)
def primefunc(t):
schedule.every(5).to(20).seconds.do(
loopfunc,t)
while True:
schedule.run_pending()
time.sleep(1)
def main():
for num in [1,2]:
thrs.append(Thread(target=primefunc(num)))
thrs[-1].start()
print(threading.active_count)
if __name__ == '__main__':
main()
当尝试如上所述运行它时,只有第一个线程被初始化并循环运行。所以我的输出总是myval=1
当我为目标函数插入lambda 时:
thrs.append(Thread(target=lambda:primefunc(num)))
两个线程都已初始化,但我有随机双输出
myval=2
myval=2
或
myval=1
myval=1
这里发生了什么? 亲切的问候,MK
【问题讨论】:
-
这一行
thrs.append(Thread(target=primefunc(num)))是错误的,您调用的是函数而不是将其作为参数传递。如果你想将num作为参数传递给你需要做的函数thrs.append(Thread(target=primefunc, args=[num])) -
非常感谢,你说得对。但是这样做时,我仍然会随机获得双输出
-
你怎么知道的?每次执行线程时,您都会使用
clear()重置屏幕 -
是的,这就是为什么它应该只打印一次“myval=X”,但有时它会显示相同值的双重打印输出。
-
一般来说,这对于仅并行运行 2 个函数来说似乎有点矫枉过正,好的旧线程有什么问题?
标签: python python-3.x multithreading scheduled-tasks python-multithreading