Найти - Пользователи
Полная версия: threading. затык при длинной строке в переменной класса.
Начало » Python для экспертов » threading. затык при длинной строке в переменной класса.
1
alphaville
Код такой. Импортируем функции (здесь для простоты только одна). И в разных нитях каждую исполняем. Результат исполнения функции - это строка, которая попадает в 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]
Помогите!
alphaville
Дополнение:

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

Если внутри функции происходит подобное:
for i in something:
result += i
Если это выполняется через нить, то на каждую итерацию уходит секунда.
alphaville
При вводе lc = threading.Lock()

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

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

время я могу видеть через вывод промежуточных результатов в лог апача
alphaville
Извините ребята, прошу пардона. Проблема РЕШЕНА!

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

Почему-то если через консоль запускать, то даже с MySQL мгновенно было. Но в любом случае с этим проблема, разберусь.
sypper-pit
как я понял , ты решил проблему самостоятельно ? если так то молочага…
alphaville
sypper-pit
как я понял , ты решил проблему самостоятельно ? если так то молочага…
Да. Просто добавил словарь, в который кэширую запросы к БД. Всё работает.
Андрей Светлов
Скорее всего в одном потоке было одно подключение к БД, в многопоточном варианте - по подключению на поток. Вот и тормоза.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB