python threading:无法将线程切换到守护进程

时间:2013-09-04 15:06:01

标签: python multithreading

我希望下一个代码能够同时执行,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,))

1 个答案:

答案 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