#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))
перед выполнением сортировки.