2013-10-25 3 views
1

Я написал программу чата и запускаю GUI, используя Tkinter, и чтобы перейти и проверить, когда появились новые сообщения, я создаю новый поток, поэтому Tkinter продолжает делать свою работу без блокировки новый поток идет и захватывает то, что мне нужно, и обновляет окно Tkinter. Это, однако, становится огромным болотом процессора, и я предполагаю, что он должен как-то делать с тем, что Thread запускается и никогда не выпускается, когда функция выполнена.Threading in Python занимает слишком много CPU

Вот соответствующий код (он уродливый и не оптимизированный на данный момент, но он выполняет свою работу, и сам не использует слишком большую вычислительную мощность, так как, когда я запускаю его не заново, он не занимает много места CPU, но он запирает Tkinter)

def interim(self): 
    threading.Thread(target=self.readLog).start() 
    self.after(5000,self.interim) 

def readLog(self): 
    print 'reading' 
    try: 
     length = len(str(self.readNumber)) 
     f = open('chatlog'+str(myport),'r') 
     temp = f.readline().replace('\n','') 
     while (temp[:length] != str(self.readNumber)) or temp[0] == '<': 
      temp = f.readline().replace('\n','') 
     while temp: 
      if temp[0] != '<': 
       self.updateChat(temp[length:]) 
       self.readNumber +=1 
      else: 
       self.updateChat(temp) 
      temp = f.readline().replace('\n','') 
     f.close() 
    except: pass 

есть ли способ, чтобы лучше управлять многопоточность, так что я не потребляют> 100% CPU очень быстро?

+0

Ваш отступ смешался, что делает невозможным точно знать, как работает ваш код. –

+0

Извините, я просто понял это и изменил его. – KevinShaffer

ответ

2

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

Действительно, нет причин продолжать чтение одного и того же файла снова и снова, не так ли? Почему бы не прочитать все это раз и сохранить то, что вы читаете в памяти. Затем, когда вы заново прочитаете его за пять секунд, вы можете пропустить все байты, которые вы уже прочитали (через seek()), и просто прочитайте новые данные, которые были добавлены. При этом вам даже не нужно использовать потоки.

Кажется, вы делаете больше работы, чем вам нужно, когда это похоже на то, что вы действительно пытаетесь сделать, это эмулировать «хвост -f».

+0

Это в значительной степени это, вы могли бы объяснить немного больше о функции seek(), может быть, пример? Это похоже на мой план, а также где бы вы поместили команду {after} для запуска после завершения потока? Это то, о чем я думал, но не знаю, как это сделать. – KevinShaffer

+0

В итоге я просто использовал этот и один поток в начале только для этой функции, хорошо работал. – KevinShaffer

0

Трудно найти предполагаемую проблему с производительностью/потоком без какого-либо кода, который можно запустить.

Вы уверены, что это резьба, которая всасывает весь процессор? Для меня это довольно странно. Если вы заменяете

threading.Thread(target=self.readLog).start() 

с

self.readLog() 

не использует меньше ресурсов центрального процессора?

Если вы проверяете новые сообщения очень часто, создание потока может быть проблемой, я предлагаю вам использовать только один поток с циклом, чтобы проверять наличие новых сообщений с некоторой очередью ожидания/ожидания/сигналом для запуска нового цикла.

+0

Да, он использует меньше CPU, но Tkinter замерзает на несколько секунд, а затем снова запускается снова. – KevinShaffer

Смежные вопросы