LINUX.ORG.RU

uwsgi: закрыть http соединение и продолжить выполнение скрипта

 ,


0

1



uwsgi документация:

def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]

Возможно ли послать http ответ(закрыть http соединение) и продолжить выполнение скрипта(без использования потоков/очередей/внешних сервисов и тд)? Типа этого:
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    end_response(b"Hello World")
    #HTTP connection is closed
    #continue execution..


Ответ на: комментарий от WitcherGeralt

полезность русского айти сообщества и в частности ЛОРа ощутимо уступает англоязычным аналогам к сожалению. хорошего вечера.

kasha
() автор топика
Ответ на: комментарий от kasha

полезность русского айти сообщества и в частности ЛОРа ощутимо уступает англоязычным аналогам к сожалению

10 лет ушло чтобы это понять и при этом не хватило нескольких минут, чтобы подождать других ответов?

vvn_black ★★★★★
()
Ответ на: комментарий от kasha

О какой полезности может идти речь, когда человек сам всё знает, но всё равно задаёт тупые вопросы?

Твоя идея крайне сомнительная и даже тупая. Но если настаиваешь, то тебе нужен асинхронный wsgi-сервер и пихать свои кастомные таски в его ивент-луп.

WitcherGeralt ★★
()

напишите пожалуйста тезисно за что на ЛОРе дают звезды. просто за количество сообщений, не важно какой полезности? если писать много «винда маст дай» в технических обсуждениях(не толкс), есть возможность дослужиться до больших звезд?

kasha
() автор топика
Ответ на: комментарий от kasha

напишите пожалуйста тезисно за что на ЛОРе дают звезды.

Ну так почитай в исходниках.

закрыть http соединение и продолжить выполнение скрипта

нет, ты должен вернуть wsgi серверу ответ, чтобы он передал его веб серверу. Если тебе нужно выполнить какую-то логику — разумеется тебе нужно передать задачу кому-то другому для завершения.

conformist ★★★
()
Ответ на: комментарий от anonymous

Ну а как тебе асинхронщина поможет? Тебе нужно завершить вызов функции и отдать результат. Асинхронно это будет или нет — разницы никакой.

conformist ★★★
()
Ответ на: комментарий от conformist

нет, ты должен вернуть wsgi серверу ответ, чтобы он передал его веб серверу. Если тебе нужно выполнить какую-то логику — разумеется тебе нужно передать задачу кому-то другому для завершения.

у меня полностью готов ответ, и я его хочу передать и закончить взаимодействие с клиентом. грубо говоря нужен аналог этого: http://php.net/manual/en/function.fastcgi-finish-request.php
после этого нужно продолжить выполнение скрипта

kasha
() автор топика
Ответ на: комментарий от WitcherGeralt

Даже в эту теорию можно уложить только то, что кастомный wsgi не отдаст ответ до тех пор, пока таска не будет выполнена, что уже не укладывается в рамки запроса.

Таким образом:

  • получили запрос
  • отдали ответ

– в фоне чё то делаем

conformist ★★★
()
Ответ на: комментарий от kasha

Если ты хочешь что-то финализировать, то бери практически любой фреймворк, там это будет. Например, во фласке есть возможность выставить как локальный (разовый), так и глобальный коллбек, который выполнится после запроса: http://flask.pocoo.org/docs/1.0/patterns/deferredcallbacks/

Если же действительно какая-то весомая задача, то я тебе уже выше написал как.

WitcherGeralt ★★
()
Ответ на: комментарий от kasha

Что-то подобное гуглится здесь. Насколько я понял, клиенту возвращается ответ, но он всё же ждёт до конца, т.е. это не бэкграунд таска, она активна, но надо, чтобы клиент ждал окончания.

conformist ★★★
()
Последнее исправление: conformist (всего исправлений: 1)

Можно я думаю воспользоваться короутинами (coroutines) и вернуть ответ и продолжить скрипт... ну или породить фоновый процесс который будет все фоновые задачи выполнять.

slapin ★★★★★
()
Ответ на: комментарий от conformist

По ссылке другой сценарий: там ответ передается частями, мне нужно отдать ответ клиенту сразу и продолжить выполнение уже без соединения с ним

kasha
() автор топика
Ответ на: комментарий от slapin

да: короутины, многотопочность, rabbitmq и тд это все круто. я пожалуй найду аналог, чтоб был в состоянии закрыть соединение как php-fpm без усложнений на ровном месте без надобности.

kasha
() автор топика
Ответ на: комментарий от kasha

Не уверен, что чётко понимаю, как это делает php, но если мы отдали ответ клиенту, то нет смысла больше задерживать wsgi, пусть занимается следующими запросами, а то, что нужно выполнить после ответа — можно выполнить с помощью тех же celery и подобных. Это удобно и реализуется очень быстро.

conformist ★★★
()
Ответ на: комментарий от conformist

это усложняет код, мне в данный момент это не нужно. нагрузка очень маленькая пока что поэтому uwsgi может быть занят. я хочу: close(sd); //close socket
++i; etc
не понимаю почему это должно быть проблемой, я так понимаю uwsgi это просто не поддерживает

kasha
() автор топика
from threading import Thread

def some_func():
    pass


def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    end_response(b"Hello World")
    t = Thread(target=some_func, args=())
    t.start()
    #HTTP connection is closed
    #continue execution..

Или же делай свою очередь или используй celery или опять же строй костыли или асинхронно делай.

полезность русского айти сообщества и в частности ЛОРа ощутимо уступает англоязычным аналогам к сожалению. хорошего вечера.

Тебе никто ничего не должен.

ggrn ★★★★★
()
Ответ на: комментарий от ggrn

Тебе никто ничего не должен.

а причем здесь долг? смысл захламлять технические обсуждения набивкой рейтинга
бессмысленными сообщениями, троллингом, поддержкой своего ЧСВ? насколько полезными
будут такие обсуждение другим специалистам? есть же Talks, есть предметные разделы. назвать тогда нужно по-другому Development/Web-Development.

kasha
() автор топика
Ответ на: комментарий от kasha

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

сказал человек, который флеймогонит и набрасывает в рамках собственного же «технического» треда.

BigAlex ★★★
()
Ответ на: комментарий от kasha

это Россия, на ЛОРе удаляют плохие посты про Путина, но ответы не по теме(оценка полезности идеи, ответы с применением потоков, ) в обсуждениях поощряется звездами

kasha
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.