我希望下一个代码能够同时执行,os.walk迭代中的所有文件名,随机得到0,都会进入结果字典。并且所有具有一些超时的线程都将进入deamon模式,并且一旦脚本结束就会被杀死。但是,脚本会考虑每个线程的所有超时。
为什么会这样?它是否应该将所有线程放在backgroung中并在它们无法完成时杀死它们并在脚本执行结束之前返回结果?谢谢。
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).
Soulution: 在2.7.2中我不得不把结束昏迷放在args元组中,考虑到我只有1个变量。天知道为什么这不影响2.7.3版本。这是
t = threading.Thread(target=check_file, args=(filename))
并开始使用
t = threading.Thread(target=check_file, args=(filename,))
答案 0 :(得分:0)
我了解您要做的是什么,但您没有使用正确的线程格式。我修复了你的例子......查看Queue类,了解如何正确执行此操作。
其次,永远不要对文件路径进行字符串操作。使用os.path
模块;除了在大多数时间你都不会想到的字符串之间添加分隔符之外,还有很多其他内容。
import threading
import os
import time
import random
import Queue
def check_file():
while True:
item = q.get()
time.sleep(item[1])
print item
q.task_done()
q = Queue.Queue()
result = []
for home,dirs,files in os.walk("."):
for ifile in files:
filename = os.path.join(home, ifile)
q.put((filename, random.randint(0,5)))
number_of_threads = 25
for i in range(number_of_threads):
t = threading.Thread(target=check_file)
t.daemon = True
t.start()
q.join()
print result