我希望下一个代码同时执行,并且来自 os.walk 迭代的所有文件名,随机得到 0,将进入结果字典。并且所有有一些超时的线程都将进入守护程序模式,并在脚本结束时立即被杀死。但是,脚本尊重每个线程的所有超时。
为什么会这样?如果它们在脚本执行结束之前无法完成并返回结果,是否应该将所有线程置于后台并杀死它们?谢谢你。
import threading
import os
import time
import random
def check_file(file_name,timeout):
time.sleep(timeout)
print file_name
result.append(file_name)
result = []
for home,dirs,files in os.walk("."):
for ifile in files :
filename = '/'.join([home,ifile])
t = threading.Thread(target=check_file(filename,random.randint(0,5)))
t.setDaemon(True)
t.start()
print result
解决方案:我发现我的错误:
t = threading.Thread(target=check_file(filename,random.randint(0,5)))
必须
t = threading.Thread(target=check_file, args=(filename,random.randint(0,5)))
在这种情况下,线程将产生一个线程,其函数作为对象并给它参数。在我最初的示例中,必须在线程产生之前解析带有 args 的函数。这是公平的。
但是,上面的示例在 2.7.3 对我有用,但在 2.7.2 我无法使其工作。我得到了例外
function check_file accepts exactly 1 argument (34 is given).
解决方案:在 2.7.2 中,考虑到我只有 1 个变量,我不得不将结尾昏迷放在 args 元组中。天知道为什么这不影响 2.7.3 版本。它是
t = threading.Thread(target=check_file, args=(filename))
并开始与
t = threading.Thread(target=check_file, args=(filename,))