0

我有一个非常简单的用例,我必须在 2 个不同的目录中找出过去 10 分钟内修改过的文件。

由于有两个不同的目录,因此我启动了两个单独的线程来执行此操作,并且在每个正在运行的线程中,存在检查已修改文件的逻辑。

以下是相同的代码:

import threading
import os
import time
from subprocess import Popen, PIPE

def getLatestModifiedFiles(seconds, _dir):
    files = (fle for rt, _, f in os.walk(_dir) for fle in f if time.time() - os.stat(
    os.path.join(rt, fle)).st_mtime < 300)
    return list(files)

def getLatestModifiedFilesUnix(seconds, _dir):
    lastseconds = seconds * -1
    p = Popen(['/usr/bin/find', _dir, '-mmin', str(lastseconds)], stdout=PIPE, stderr=PIPE)
    out, err = p.communicate()
    print out.strip("\r\n")
    if err != "":
        print err

def run(logPath):
    threadName = threading.currentThread().getName()
    getLatestModifiedFilesUnix(10, logPath)
    #files = getLatestModifiedFiles(300,logPath)
    #for file in files:
     #   print "message from %(ThreadName)s...%(File)s" % {'ThreadName': threadName, 'File' : file}


if __name__ == "__main__":
    logPaths = ["/home/appmyser/Rough", "/home/appmyser/Rough2"]
    threads = []
    for path in logPaths:
        t = Thread(target=run, args=(path,))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

函数:getLatestModifiedFiles使用本机 Python 代码查找最新修改的文​​件,另一方面,函数:getLatestModifiedFilesUnix使用 unix find 命令执行相同的操作。

在第二种情况下,我使用子进程,据我所知,它创建了一个新进程。我的问题是,从线程中调用子进程是一种好习惯吗?有什么我应该考虑的后果吗?

另外新创建的子进程的父进程是什么?有人可以详细地向我指出它是如何工作的吗?

提前谢谢了。

4

1 回答 1

1

从后面。多线程进程仍然只是一个进程。并且无论哪个线程派生(和执行)该进程都是新生成的子进程的父进程。你可以ps -efL在你的系统上运行看看。如果您有任何多线程应用程序正在运行(很可能),您将看到各个线程和它们自己的轻量级进程标识共享一个进程 ID。

至于后果。使用subprocess时,真的不应该因为这样做而遇到任何意外。在较低级别,如果您分叉并拥有多个线程,则需要注意,因为新创建的进程将只有一个(调用)线程,这可能会带来各种乐趣,包括它是否依赖其他线程来释放例如锁. 但是由于您此后不久运行 exec,因此无论如何您都会运行新代码。


这不是您问题的直接主题,但我反对调用find以获取目录列表。我宁愿在“内部”处理它。

同样在 中的那个生成器上getLatestModifiedFiles,调用time.time()每个比较不仅更昂贵,而且还有效地意味着目标职位正在移动,具体取决于每个项目何时被处理。

于 2019-01-30T11:52:52.573 回答