Python - вызов команды Linux из пула потоков не работает - PullRequest
0 голосов
/ 03 ноября 2011

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

У меня есть около 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 , возможно, он сломан?

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

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

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

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

0 голосов
/ 04 ноября 2011

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

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

0 голосов
/ 03 ноября 2011

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

...