#python #multithreading #multiprocessing
#python #многопоточность #многопроцессорная обработка
Вопрос:
Я ни за что на свете не смог бы найти ответ на эту проблему.
Я написал скрипт, который выполняет сотни тяжелых вычислений. У меня есть блестящая идея записать эти вычислительные задачи на C , а затем использовать ctypes Python для взаимодействия с ними.
Я подумал про себя, что мог бы даже оптимизировать это дальше, используя параллелизм. Мой первоначальный подход заключается в использовании многопоточности. И тогда я понял, что мои задачи привязаны к процессору. Поэтому имеет смысл только то, что вместо этого мы используем многопроцессорную обработку. Что ж, оказывается, что модуль многопроцессорной обработки значительно медленнее, чем потоковая обработка, вероятно, из-за накладных расходов.
И тогда я наткнулся на это. Для тех, кто не хочет переходить по отрывочной ссылке, оказывается, что модуль ctypes обходит GIL. Это означает, что моя попытка многопоточности в Python может обеспечить истинный параллелизм.
Итак, мой вопрос: есть ли где-нибудь в официальной документации упоминание о ctypes и GIL?
Я прикрепил код, который я использую для тестирования потоков ctypes и многопроцессорной обработки.
# Method 1: Using threading
start = time()
threads = []
for arg in args:
threads.append(threading.Thread(target=some_ctypes_func, args=(arg, )))
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print(f"Elapsed time: {time() - start}")
# Method 2: Using multiprocessing
results = []
with Pool(8) as p:
start = time()
for arg in args:
result = p.apply_async(some_ctypes_func, args=(arg,))
results.append(result)
results = [result.get() for result in results]
print(f"Elapsed time: {time() - start}")
Используя приведенный выше код, модуль потоковой обработки примерно в 2-3 раза быстрее, чем многопроцессорная обработка.
Комментарии:
1. Если у вас уже есть функция на C или любом другом родном языке, какой смысл использовать python только для выполнения этих потоков? Не лучше ли реализовать также многопоточность на C ?
2. @OlvinRoght Ну, одна функция завершила свое выполнение менее чем за секунду. Выполнение этой функции с разными входными данными в сотни раз более трудоемко. Кроме того, Python предоставляет приятный высокоуровневый интерфейс для многопоточности, что приятно.
3. Я просто хочу указать вам, что если вы реализуете простую многопоточность на C и функцию экспорта, которая выполняет всю работу и возвращает результаты, это будет намного быстрее. Кстати, есть много способов реализовать многопоточность на C с помощью пары строк кода, не большая разница с python