Python — вызов команды Linux из пула потоков не работает

#python #linux #multithreading #threadpool

#python #linux #многопоточность #пул потоков

Вопрос:

—Привет, ребята, —

У меня есть около 4000 (1-50 МБ) файлов для сортировки.

Я думал, что Python вызовет команду сортировки Linux. И поскольку я думаю, что это может быть связано с вводом-выводом, я бы использовал библиотеку потоков.

Итак, вот что у меня есть, но когда я запускаю его и просматриваю системный монитор, я не вижу всплывающих задач сортировки 25. Кажется, он выполняется по одному за раз? Что я делаю не так?

 ...
print "starting sort"
def sort_unique(file_path):
    """Run linux sort -ug on a file"""
    out = commands.getoutput('sort -ug -o "%s" "%s"' % (file_path, file_path))
    assert not out

pool = ThreadPool(25)
for fn in os.listdir(target_dir):
    fp = os.path.join(target_dir,fn)
    pool.add_task(sort_unique, fp)

pool.wait_completion()
  

Вот откуда берется ThreadPool, возможно, это сломано?

Ответ №1:

Вы все делаете правильно.

В python есть нечто, что называется GIL;
Глобальная блокировка интерпретатора, которая в конечном итоге приводит к тому, что python выполняет только один поток одновременно.

Вместо этого выберите подпроцесс :), python не является многопоточным.

Комментарии:

1. Я знаю о GIL, но я думаю, что GIL должен быть выпущен при выполнении команды Linux, верно?

2. Я бы так не сказал, но я хотел бы услышать подтверждение от кого-то еще.

3. Я согласен с bua, используйте подпроцесс.

Ответ №2:

На самом деле это, похоже, работает. Я говорил слишком рано. Я не уверен, хотите ли вы, ребята, удалить это или что? Извините за это.

Ответ №3:

Обычно люди делают это, создавая несколько процессов. multiprocessing Модуль упрощает это.

С другой стороны, Python довольно хорош в сортировке, так почему бы просто не прочитать файл в список строк file.readlines() , а затем отсортировать его в Python. Вам нужно было бы написать key функцию для использования с list.sort() для выполнения -g опции, и вам также пришлось бы удалять дубликаты, то -u есть option . Самый простой способ (и быстрый способ) удалить дубликаты — это выполнить list(set(UNsortedfile)) перед выполнением сортировки.