Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 28, 2009 12:33:15

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

threading. затык при длинной строке в переменной класса.

Код такой. Импортируем функции (здесь для простоты только одна). И в разных нитях каждую исполняем. Результат исполнения функции - это строка, которая попадает в self.total.

Проблема в том, что пока эта строка короткая (10-15 кб) - всё нормально. Когда строка становится 60 кб - комп 2 минуты пыхтит чтобы вывести её.

Затык связан именно с нитями, т.к. если исполнять функцию без них - всё мгновенно.

import threading

class TripThread(threading.Thread):
def __init__(self, func):
self.func = func
threading.Thread.__init__(self)
def run(self):
self.total = self.func()


def application(environ, start_response):

funcs = []
RouteSuppliers = ['Supplier1',]
for RouteSupplier in RouteSuppliers:
funcs.append( getattr( __import__(RouteSupplier) , RouteSupplier ) )
t = []
for func in funcs:
t.append(TripThread(func))
for i in t:
i.start()
trbusyflag = True
while trbusyflag:
trbusyflag = False
for i in t:
if i.isAlive() == True:
trbusyflag = True
output = ""
for i in t:
output += i.total

status = '200 OK'

response_headers = [('Content-type', 'application/javascript'),('Content-Length', str(len(output)))]
start_response(status, response_headers)

return [output]
Помогите!



Офлайн

#2 Ноя. 28, 2009 13:01:17

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

threading. затык при длинной строке в переменной класса.

Дополнение:

Вопрос на самом деле проще. При выполнении в нити функция выполняется долго. При выполнении просто так - мгновенно.

Если внутри функции происходит подобное:

for i in something:
result += i
Если это выполняется через нить, то на каждую итерацию уходит секунда.



Офлайн

#3 Ноя. 28, 2009 13:47:59

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

threading. затык при длинной строке в переменной класса.

При вводе lc = threading.Lock()

и заключении всего кода функции между lc.acquire() и lc.release()

ничего не меняется. всё очень долго. по 1-2 секунды на каждый result += i

время я могу видеть через вывод промежуточных результатов в лог апача



Офлайн

#4 Ноя. 28, 2009 13:59:04

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

threading. затык при длинной строке в переменной класса.

Извините ребята, прошу пардона. Проблема РЕШЕНА!

У меня там на каждой итерации стояло обращение к MySQL. Это место надо закешировать.

Почему-то если через консоль запускать, то даже с MySQL мгновенно было. Но в любом случае с этим проблема, разберусь.



Офлайн

#5 Ноя. 28, 2009 14:04:06

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

threading. затык при длинной строке в переменной класса.

как я понял , ты решил проблему самостоятельно ? если так то молочага…

Отредактировано (Ноя. 28, 2009 14:05:35)

Офлайн

#6 Ноя. 28, 2009 14:37:39

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

threading. затык при длинной строке в переменной класса.

sypper-pit
как я понял , ты решил проблему самостоятельно ? если так то молочага…
Да. Просто добавил словарь, в который кэширую запросы к БД. Всё работает.



Офлайн

#7 Ноя. 28, 2009 22:05:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

threading. затык при длинной строке в переменной класса.

Скорее всего в одном потоке было одно подключение к БД, в многопоточном варианте - по подключению на поток. Вот и тормоза.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version