2015-09-08 2 views
0

Мне нужно небольшое учебное пособие: как добавить многопоточные операции в цикле?. У меня есть цикл, который вызывает другие функции, обновляет индикатор выполнения в GUI Tkinter и других операциях, и такие операции должны выполняться быстрее, так как мой GUI блокируется. Любая идея, как это сделать?, Например, как вы бы добавить, если он (конечно, учитывая, что есть операции с графическим интерфейсом, такими как обновление индикатора в петле.)Как добавить многопроцессорность или потоки для цикла операций? Python

def MakeSum(a, b): 
    s = a + b 

    return s 

def GoDiv(a, b): 

    div = a/b 

    return div 

def Process(): 

    for i in range(10): 

     result = MakeSum(i, i) 

     print("Result of the sum of " + str(i) + " + " + str(i) + 
        " = " + str(result)) 

     try: 
      final = GoDiv(result, i) 

     except: 
      print("Denominator Is Zero, can't Div") 

     else: 
      print("Result of the Div of " + str(result) + "/" + str(i) + 
         " = " + str(final)) 
Process() 

В основном то, что мой цикл идет по каталогу и ищет изображения. После поиска и открывается с изображением PIL, я извлекаю текст PyTesseract.I вызываю функцию, которая ищет меня точно, что я хочу из извлеченного текста изображения. После этого я вырезал изображение и переименовал его с извлеченным фрагментом текста. Обновите индикатор выполнения на каждой итерации и обработайте исключения, например, в приведенном выше коде.

Можно ли все это оптимизировать? Я проанализировал сложность алгоритмов, реализованных в функциях, которые я вызываю, и только O (L), где L - длина строки, чтобы найти то, что я хочу.

PS: Я не могу вставить весь код здесь, так как он слегка загрязнен и очень длинный. Я в процессе. Но как только я закончил то, что вы найдете в моем репозитории Git: http://www.Github.com/AndresEngineer получил там одну часть кода в проекте репозитория.

Заранее спасибо.

+1

В Интернете должно быть много информации об этом. Вы пробовали искать? – RedX

+0

Я попробовал поиск по Google, чтобы найти учебник, проблема в том, что есть много потоков и объясняют, что немного из того, что я хочу. Нити, применяемые к транзакциям, которые находятся за пределами цикла. Хотел бы я привести пример, если бы я появился. Большое спасибо за предложение. – Andrespengineer

ответ

0

Одна вещь, которую вы должны понимать, заключается в том, что в tkinter разрешается только обновлять экран только основной поток, поэтому любые другие потоки не могут обновить индикатор выполнения. Если у вас длинный цикл, tkinter не будет обновлять экран до тех пор, пока цикл не будет выполнен, оставив впечатление, что графический интерфейс заблокирован. Способом борьбы с этим является вызов метода update_idletasks одного из ваших виджетов.

Идея состоит в том, что Tk только обновляет экран, когда ему больше нечего делать (когда он простаивает.). Вызов update_idletasks заставляет его выполнять задачи, которые он в противном случае отложил бы до тех пор, пока не станет холостым.

Не видя кода, я не могу дать конкретное предложение о том, когда звонить по телефону update_idletasks, конечно.

Надеюсь, это поможет.

EDIT: прочитайте это сообщение: update idletasks when toplevel hasn't the focus Что-нибудь, что Donal Fellows должно сказать о Tk/tkinter, гораздо более ценно, чем что-либо, что я должен сказать.