Почему время выполнения программы такое же, как и раньше? - PullRequest
1 голос
/ 10 июня 2019

По какой-то причине время выполнения остается таким же, как и без потоков.

Но если я добавлю что-то вроде time.sleep(secs), то очевидно, что работа внутри цели определена как def d.

def d(CurrentPos, polygon, angale, id):

    Returnvalue = 0
    lock = True
    steg = 0.0005
    distance = 0
    x = 0
    y = 0

    while lock == True:
        x = math.sin(math.radians(angale)) * distance + CurrentPos[0]
        y = math.cos(math.radians(angale)) * distance + CurrentPos[1]
        Localpoint = Point(x, y)
        inout = polygon.contains(Localpoint)
        distance = distance + steg
        if inout == False:
            lock = False

    l = LineString([[CurrentPos[0], CurrentPos[1]],[x,y]])
    Returnvalue = list(l.intersection(polygon).coords)[0]
    Returnvalue = calculateDistance(CurrentPos[0], CurrentPos[1], 
    Returnvalue[0], Returnvalue[1])

    with Arraylock:
        ReturnArray.append(Returnvalue)
        ReturnArray.append(id)



def Main(CurrentPos, Map):

    threads = []
    for i in range(8):
        t = threading.Thread(target = d, name ='thread{}'.format(i), args = 
        (CurrentPos, Map, angales[i], i))
        threads.append(t)
        t.start()
    for i in threads:
        i.join()

1 Ответ

2 голосов
/ 10 июня 2019

Добро пожаловать в мир Глобальной блокировки переводчиков a.k.a. GIL . Ваша функция выглядит как код, связанный с процессором (некоторые вычисления, циклы, ifs, доступ к памяти и т. Д.). Извините, вы не можете использовать потоки для увеличения производительности задач, связанных с процессором. Это ограничение Python.

В Python есть функции, которые выпускают GIL, например, дисковый ввод / вывод, сетевой ввод и вывод, который вы на самом деле пробовали: сон. И действительно, потоки увеличивают производительность задач, связанных с вводом / выводом. Но арифметический доступ и / или доступ к памяти не будут работать параллельно в Python.

Стандартный обходной путь - использовать процессы вместо потоков. Но это часто бывает болезненно из-за непростого межпроцессного взаимодействия. Вы также можете рассмотреть возможность использования некоторых библиотек низкого уровня, таких как numpy, которые на самом деле выпускают GIL в определенных ситуациях (вы можете сделать это только на уровне C, GIL не доступен из самого Python) или , используя другой язык без это ограничение, например C #, Java, C, C ++ и т. Д.

...