Проблема с threading и multiprocessing в python
Есть готовый код, который запускает командную строку и выполняет операции, попутно логирует их. Пытаюсь настроить threading python для более быстрой и оптимизированной работы, но при указании параметра ничего не меняется. Код приложил. Может подскажет какие параметры прописать.
import threading
from multiprocessing.pool import ThreadPool as Pool
import argparse
import requests
import os
parser = argparse.ArgumentParser()
parser.add_argument(
"-t",
"--threads",
help="amount of threads (default: 1000)",
type=int,
default=100,
)
args = parser.parse_args()
lock = threading.Lock()
def main():
with lock:
...
if __name__ == "__main__":
if not getInternet():
print(bcolors.RED + "No internet connection")
makeDir()
threads = args.threads
pool = Pool(threads)
for _ in range(10):
pool.apply_async(main)
pool.close()
pool.join()
Ответы (1 шт):
Если я правильно понимаю, то собственно эта блокировка не даёт выполнять main более чем одному процессу одновременно, каждый следующий заходящий в main процесс ждёт, пока предыдущий процесс отпустит блокировку:
def main():
with lock:
...
В результате у вас выполнение процессов получается последовательное, а не параллельное, и естественно никакого ускорения не происходит от того, что вы запустили много процессов.
Блокировка должна делаться только в так называемых критических областях кода, которые не должны выполняться одновременно, чтобы не нарушить целостность данных. В остальное время выполнения кода блокировку делать не следует, если вы хотите, чтобы код выполнялся параллельно. Блокировок должно быть как можно меньше и они должны быть как можно более кратковременными, если вы хотите достичь какого-то ускорения вообще. Нужно помнить, что есть ещё расходы на организацию многопоточности или многопроцессности и в каких-то случаях эти расходы могут перекрыть и даже превысить всю выгоду от параллельного выполнения кода.