Форум сайта python.su
Код такой. Импортируем функции (здесь для простоты только одна). И в разных нитях каждую исполняем. Результат исполнения функции - это строка, которая попадает в 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]
Офлайн
Дополнение:
Вопрос на самом деле проще. При выполнении в нити функция выполняется долго. При выполнении просто так - мгновенно.
Если внутри функции происходит подобное:
for i in something:
result += i
Офлайн
При вводе lc = threading.Lock()
и заключении всего кода функции между lc.acquire() и lc.release()
ничего не меняется. всё очень долго. по 1-2 секунды на каждый result += i
время я могу видеть через вывод промежуточных результатов в лог апача
Офлайн
Извините ребята, прошу пардона. Проблема РЕШЕНА!
У меня там на каждой итерации стояло обращение к MySQL. Это место надо закешировать.
Почему-то если через консоль запускать, то даже с MySQL мгновенно было. Но в любом случае с этим проблема, разберусь.
Офлайн
как я понял , ты решил проблему самостоятельно ? если так то молочага…
Отредактировано (Ноя. 28, 2009 14:05:35)
Офлайн
sypper-pitДа. Просто добавил словарь, в который кэширую запросы к БД. Всё работает.
как я понял , ты решил проблему самостоятельно ? если так то молочага…
Офлайн
Скорее всего в одном потоке было одно подключение к БД, в многопоточном варианте - по подключению на поток. Вот и тормоза.
Офлайн