11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54
1

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

20.12.2015, 22:46. Показов 785. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2015, 22:46
Ответы с готовыми решениями:

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

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

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

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

6
51 / 51 / 18
Регистрация: 03.12.2015
Сообщений: 167
21.12.2015, 05:41 2
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  [ТС] 3
yield from asyncio.sleep(1) <- вот тут будет обращение к асинхронному источнику данных.

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

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

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

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

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

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

Предлагаю отсюда отталкиваться, и попробовать составить код на эту задачу без использования server из asyncio. Тот код что я написал - просто попытка приблизиться к решению, на основе примеров
0
51 / 51 / 18
Регистрация: 03.12.2015
Сообщений: 167
21.12.2015, 19:03 6
Если не хотите использовать server, то можно вот так:
https://image.slidesharecdn.co... 1391438795
0
11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54
22.12.2015, 00:35  [ТС] 7
В итоге получилось вот что:
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2015, 00:35
Помогаю со студенческими работами здесь

Код обработчика для ajax отправки
Помогите разобраться, есть код, который отправляет данные в обработчик. Но самого обработчика нет...

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

Переделка внешнего обработчика для УПП 1с 8.2
Приветствую имеется внешняя обработка для УНФ позволяющая создать несколько заказов на производство...

Создание своего обработчика для страницы. (2.5)
Доброго времени суток! Допустим имеется некая страница /index.php/some/some_2/ добавленная через...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru