0

我希望下一个代码同时执行,并且来自 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,))
4

1 回答 1

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
于 2013-09-04T15:23:50.733 回答