С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54

Сопрограмма для обработчика запросов

20.12.2015, 22:46. Показов 948. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь разобраться с сопрограммами в питоне, возникла проблема (понимания сопрограмм в целом мне точно недостает)

Пытаюсь реализовать простую модель:
Есть обработчик запросов, когда приходит запрос он идет на удаленный сервер за данными далее выводит сообщение

Примерно так я себе это представляю
Python
1
2
3
4
5
6
7
8
9
10
@asyncio.coroutine
def slow_operation(future):
    yield from asyncio.sleep(1)  # тут долгий запрос
    future.set_result('Future is done!')
 
loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(slow_operation(future))
loop.run_until_complete(future)
print(future.result())
Дальше возникает вопрос:
Как добавлять в loop новые future, не дожидаясь исполнения старых
Python
1
loop.run_until_complete(future)
блокирует исполнение
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.12.2015, 22:46
Ответы с готовыми решениями:

Вызов generic_make_request из обработчика запросов блочного устройства
Есть проект: https://github.com/OrenKishon/stackbd - это блочное устройство, которое перенаправляет все запросы на некоторое другое...

AJAX вместо результата обработчика возвращает, исходный код обработчика
Здравствуйте, начал изучать AJAX и столкнулся с проблемой, при GET запросе в котором я стучу в файл php и требую что бы он вернул текст с...

Вызов обработчика кнопки из другого обработчика.
Есть кнопка, есть у ней обработчик, который делает нечто полезное. Как вызвать выполнения обработчика этой кнопки из обработчика другой...

6
51 / 51 / 18
Регистрация: 03.12.2015
Сообщений: 167
21.12.2015, 05:41
LifeMoroz,
Я Ваш код вообще не очень понял. Если Вам нужно сделать сервер, то надо использовать start_server или create_server. Где тут у Вас прием запросов?

Python
1
2
3
4
5
6
7
8
9
10
11
12
@asyncio.coroutine
def обработчик(reader, writer):
    ...
 
loop = asyncio.get_event_loop()
server_coro = asyncio.start_server(обработчик, host, port)
server = loop.run_until_complete(server_coro) # вернется сразу же. Вернет asyncio.Server
try:
    loop.run_forever() # будет вечно обрабатывать запросы
finally:
    server.close()
    loop.close()
0
11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54
21.12.2015, 16:14  [ТС]
yield from asyncio.sleep(1) <- вот тут будет обращение к асинхронному источнику данных.

Я не хочу брать asyncio сервер. Мне нужно понять как добавлять future на исполнение из другого потока например
0
51 / 51 / 18
Регистрация: 03.12.2015
Сообщений: 167
21.12.2015, 16:36
А другой поток откуда? Может Вам не нужен тут asyncio, а нужен concurrent? Не понимаю ничего. Вот у Вас есть асинхронный сервер, который принимает запросы, дальше для каждого запроса он посылает запрос на другой сервер, принимает ответ и пересылает ответ клиенту?

Добавлено через 2 минуты
Вы в 7 строчке создали Future (хотя Future не надо создавать самому). В восьмой строчке создали Task, но ссылку на него ничему не присвоили, да и сам Task не связали с циклом событий. Потом запустили цик, передав ему созданный Вами Future. Не могу отследить логику. Пояните, чего Вы хотели этими шагами достичь. Может, я просто туплю
0
11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54
21.12.2015, 17:51  [ТС]
хочу понять как это работает, поэтому туплю вероятно я.

Concurrent, насколько я понимаю, наделает кучу потоков и будет исполнять в них. Мне хочется пощупать сопрограммы.

То что здесь написано, взято из какого-то примера. И оно как-то работает, пока мне не совсем точно ясно КАК.

То что я писал в первом топике и есть формулировка задачи, такая абстрактная, потому что понимание сопрограмм пока в цлом именно абстрактное.

Еще раз поясню:
Приходит запрос (это мб на socket, а мб из другого потока исполнения, транспорты я читал, но пока не очень понятно из примеров документации куда и как), запрос идет куда-то и ждет от "куда-то" ответа, в этот момент продолжают исполняться другие запросы.

Предлагаю отсюда отталкиваться, и попробовать составить код на эту задачу без использования server из asyncio. Тот код что я написал - просто попытка приблизиться к решению, на основе примеров
0
51 / 51 / 18
Регистрация: 03.12.2015
Сообщений: 167
21.12.2015, 19:03
Если не хотите использовать server, то можно вот так:
https://image.slidesharecdn.co... 1391438795
0
11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54
22.12.2015, 00:35  [ТС]
В итоге получилось вот что:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
@asyncio.coroutine
def slow_operation():
    yield from asyncio.sleep(10)  # request to another server
    print('Future is done!')
 
def add():
    while True:
        time.sleep(1)
        asyncio.run_coroutine_threadsafe(slow_operation(), loop)
 
loop = asyncio.get_event_loop()
th.Thread(target=add).start()
loop.run_forever()
Добавлено через 5 минут
Теперь интересует, как написать свое асинхронное событие:

Например есть функция, которая долго исполняется, как выделить ее исполнение в отдельный поток, и ожидать результата в основном?

Кажется выгуглил http://stackoverflow.com/quest... n-executor
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2015, 00:35
Помогаю со студенческими работами здесь

Есть 4 формы и 4 файла обработчика для каждой. Срабатывает только последний для всех форм. Почему?
Вот ссылка на сайт сайт-------

создание обработчика для mod_perl2
Здравствуйте! Хочу написать обработчик PerlResponseHandler для mod_perl2. Никак не пойму, куда ложить модуль, чтобы апач и мод_перл его...

Создание в форме обработчика для радиокнопки
как написать к форме в базе данных обработчик событий,связанный с радио кнопкой?! помогите пожалуйста!

Объединение селекторов для одного обработчика
Здравствуйте! Задался целью привязать любое количество селекторов форм, схожих по именам, но имеющим разную нумерацию по условию...

Удаление обработчика события для компонента
Как удалить обработчик созданный в программе таким образом: textBox1.Click += new EventHandler(this.TextChanget);


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru