TheadPoolExecutor кажется бесконечным или чего-то ждет - PullRequest
0 голосов
/ 06 мая 2020
import osrm
import pandas as pd
import time
import multiprocessing
import concurrent.futures
import threading

path = 'Coordinates/Coordinates_ma_week1_correct.xlsx'
df_coordinates = pd.read_excel(path)
df_coordinates = df_coordinates[['Longitude', 'Latitude']]
list_coordinates = df_coordinates.values.tolist()
list_coordinates = list_coordinates[:100]

duration_matrix=[]
MyConfig = osrm.RequestConfig
osrm.RequestConfig.host = "router.project-osrm.org"

def get_durations(destinations, origin):
    tmp_duration = []

    start1 = time.time()

    for _ in range(10):
        try:
            result = osrm.simple_route(
                          origin, destinations,
                          output='route', overview="simplified", geometry='wkt', url_config=MyConfig)
            tmp_duration.append(result[0]["duration"])
            break
        except:
            time.sleep(10)
            print("sleeping")
            pass
    else:
        print("ran 10 times")
        raise


    end1 = time.time()


    print('processed customer: ', origin,destinations, " in: ", end1-start1, " seconds")
    print("")

    return tmp_duration


def main():
    start = time.time()


    with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:
        duration_matrix = [[executor.submit(get_durations,origin,destination) for origin in list_coordinates] for destination in list_coordinates]
        print("hallo??")
        print(duration_matrix)

    duration_matrix = pd.DataFrame(duration_matrix)

    end = time.time()
    print(duration_matrix)
    print('Done! How long did it all take?', end - start)


if __name__ == '__main__':
    main()

Итак, у меня есть файл, в котором я хочу получить продолжительность между всеми координатами. Поскольку делать это по одному медленно, я хочу использовать ThreadPoolExecutor. По какой-то причине, если я использую строку list_coordinates = listcoordinates [: 50], она работает отлично и ускоряет код. Но если я делаю это для 100 координат (list_coordinates = list_coordinates [: 100]), по какой-то причине он выполняет почти все вычисления. Но где-то это заканчивается. Не знаю где, но вроде ждет, так как код «все еще работает». Код не закончен, но почти все расчеты выполнены. Он не зависит от координат, так как работает для медленного кода на 380 координат. OSRM - это, кстати, система, в которой вы можете запрашивать продолжительность поездки из реальных дорожных сетей (например, googlemaps).

Кроме того, я переписываю это в следующий код (при использовании executeor.map ()), где та же проблема происходит:

import osrm
import pandas as pd
import time
import multiprocessing
import concurrent.futures
import threading

path = 'Coordinates/Coordinates_ma_week1_correct.xlsx'
df_coordinates = pd.read_excel(path)
df_coordinates = df_coordinates[['Longitude', 'Latitude']]
list_coordinates = df_coordinates.values.tolist()
list_coordinates = list_coordinates[:100]

duration_matrix=[]
MyConfig = osrm.RequestConfig
osrm.RequestConfig.host = "router.project-osrm.org"

def destinations(origins):
    tmp_duration = []

    start1 = time.time()
    for destinations in list_coordinates:
        for _ in range(10):
            try:
                result = osrm.simple_route(
                              origins, destinations,
                              output='route', overview="simplified", geometry='wkt', url_config=MyConfig)
                tmp_duration.append(result[0]["duration"])
                break
            except:
                time.sleep(10)
                print("sleeping")
                pass
        else:
            print("ran 10 times")
            raise


    end1 = time.time()

    print('processed customer: ', origins, " in: ", end1-start1, " seconds")
    print("")

    duration_matrix.append(tmp_duration)

    return tmp_duration


def main():
    start = time.time()
    with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:
        duration_matrix = executor.map(destinations,list_coordinates, timeout=180)
        print("hallo??")

    duration_matrix = pd.DataFrame(duration_matrix)

    end = time.time()
    print(duration_matrix)
    print('Done! How long did it all take?', end - start)


if __name__ == '__main__':
    main()
...