apply_sync работает с той же скоростью, что и serial

#python #multiprocessing

#python #многопроцессорность

Вопрос:

У меня есть функция, которая загружает процессор на 128 мс, я попытался ее распараллелить, но эффект тот же, никакого ускорения вообще. Я не уверен, что я там делаю не так.

Эта функция является вычислительно дорогой:

 def compute(id, x,y,frame_id,df_region, region_buffered, df_line):
    gb = ('trajectory_id',)
    global general_pd
    general_pd.loc[len(general_pd)] = [id, x,y, frame_id]
    grouped = general_pd.loc[general_pd['trajectory_id'] == id]


    rpp = RawParameterProcessor(grouped, df_line, frame_idx, df_region, region_buffered,  gb=gb, v_thresh=5 / 3.6)

    df_parameter_car = rpp.compute()

    return df_parameter_car
  

и я использую его в обнаружении объектов tensorflow, где я выполняю вычисления для обнаруженных объектов:

Обратите внимание, что следующий фрагмент кода выполняется в основном цикле, где я получаю эти данные из видеозаписи cv2.

ДЛЯ КАЖДОГО КАДРА ИЗ ВИДЕОЗАХВАТА

 for trk in car_detections:
    trk = trk.astype(np.int32)
    p = np.array([[((trk[1]   trk[3]) / 2,  (trk[0]   trk[2]) / 2)]], dtype=np.float32)
    center_pt = cv2.perspectiveTransform(p, H)
    ptx = center_pt.T.item(0)
    pty = center_pt.T.item(1)
    df_cars = pool.apply_async(compute, (trk[4], ptx, pty, frame_idx, df_region, region_buffered, df_line,))
    results.append(df_cars)
    for result in results:
        genera_data_pd_cars = genera_data_pd_cars.append(result.get())
  

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

1. Примеры говорят, что # launching multiple evaluations asynchronously *may* use more processes

2. @wwii значит, решения нет?

3. Возможно, вы захотите использовать concurrent.futures с ProcessPoolExecutor . concurrent.futures довольно приятный, он обрабатывает всю закулисную деятельность по распределению аргументов между функциями в нескольких процессах и извлечению результатов. Примеры довольно легко адаптировать.

4. Мне нравится использовать формат примера, приведенного для ThreadPoolExecutor : отправка нескольких задач в цикле и сбор фьючерсов, затем повторение фьючерсов по мере их завершения для получения результатов. Хотя другие способы также работают довольно хорошо. Поймите, что для настройки всего этого и транспортировки объектов в процессы и из процессов требуется время — YMMV в зависимости от фактической загрузки процессора или времени выполнения задачи.

5. пул = ProcessPoolExecutor(14) все та же скорость, очень медленная