Вызов формы команды подпроцесса внутри потока Python - PullRequest
0 голосов
/ 30 января 2019

У меня есть очень простой вариант использования, в котором мне нужно найти файлы, которые были изменены за последние 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.

Во втором случае я использую подпроцесс, который, насколько мне известно, создаетновый процесс.Мой вопрос заключается в том, является ли хорошей практикой вызывать подпроцесс из потока?Есть ли какие-то последствия для этого, которые я должен рассмотреть?

И каков родительский процесс недавно созданного подпроцесса?Может кто-нибудь подробно указать мне, как это работает?

Большое спасибо заранее.

1 Ответ

0 голосов
/ 30 января 2019

со спины.Многопоточный процесс по-прежнему только один процесс.И независимо от того, какой поток разветвляется (и выходит), этот процесс является родителем вновь порожденного потомка.Вы можете запустить ps -efL в своей системе, чтобы посмотреть.Если у вас запущены многопоточные приложения (очень вероятно), вы увидите отдельные потоки и с их собственной легкой идентификацией процесса, совместно использующей один идентификатор процесса.

Что касается последствий.При использовании subprocess действительно не должно быть никаких сюрпризов только для этого.На более низком уровне внимание должно быть уделено, если вы выполняете разветвление и имеете несколько потоков, поскольку у вновь созданного процесса будет только один (вызывающий) поток, который может привести к разного рода забавам, в том числе, если он зависит от других потоков, например, для снятия блокировок.,Но поскольку вскоре после этого вы запускаете exec, вы все равно запускаете новый код.


Это не является предметом вашего прямого вопроса, но я бы возражал против вызова find для получения списка каталогов.Я бы предпочел иметь дело с этим «в доме».

Также на этом генераторе в getLatestModifiedFiles вызов time.time() для каждого сравнения не только дороже, но и эффективно означает, что посты целиперемещение в зависимости от того, когда обрабатывается каждый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...