作为一个线程返回调用者(不要这样做)

时间:2014-06-24 04:45:33

标签: python multithreading

我想要一个检查文件是否有变化的函数 每次发现更改时,它都会启动一个线程并将流返回给调用者。

def if_file_changes(file_loc):
    import threading, time 
    with open(file_loc, 'r') as nctn:
        state = nctn.read()
    while True:
        time.sleep(5)
        with open(file_loc, 'r') as nctn:
            check_state = nctn.read()
        if check_state != state:
            state = check_state
            check_state = None
            t = threading.Thread(return) # How do I return in a thread?
            t.daemon = True
            t.start()

修改
我不明白这个问题。当我应该在调用者处时,我试图在功能级别创建线程 我的解决方案如下。

2 个答案:

答案 0 :(得分:0)

您可以通过在新线程中设置全局值来实现返回线程

G_THREAD_RET = None

def thread_func():
    #do something here
    G_THERAD_RET = ret

def main():
    #this is the main thread function
    # wait for child thread here
    ret = G_THERAD_RET # get the return value of child thread

如果您只有几个线程可以从中获取返回值,这是最简单的。

此外,您可以将一个参数传递给线程函数,并在线程退出之前将其设置在新线程中:

def func(ret=[]):
    time.sleep(2)
    ret.append(2)

def main():
    ret = []
    t = threading.Thread(target=func,args=(ret,))
    t.start()
    t.join()
    print ret

你必须使用一个列表来返回值,因为在python中只有list和dict是可变的。

PS:你真的需要阅读整个文件来检查是否有一些变化?检查时间戳对于检测文件更改更为常见。

答案 1 :(得分:0)

我所做的更正是将调用者模块化为函数,以便可以根据需要重复任何部分。然后导入文件检查器并在需要的地方调用它。

功能:

def on_file_change(func=None, file_loc=None, start_activated=False):
    import threading, time
    def s():
        with open(file_loc, 'r') as nctn:
            state = nctn.read()
        while True:
            time.sleep(5)
            with open(file_loc, 'r') as nctn:
                check_state = nctn.read()
            if check_state != state and check_state != None and check_state != '':
                state = check_state
                t = threading.Thread(target=func)
                t.start()
    if start_activated == True:
        t = threading.Thread(target=func)
        t.start()
    s()