Size: a a a

2021 May 14

A

Artem in Go-go!
горутины, которые собирают данные по url
источник

AB

Andrey Burov in Go-go!
источник

A

Artem in Go-go!
благодарю 🙂
источник

J

Je in Go-go!
Желательно в http request и передавать контекст, код внутри пакета net/http проверяет и отменяет запрос. Правда есть подводные - никто тебе не дает гарантию, выполнится ли запрос в итоге, или нет. То есть он может и выполниться, и ты получишь на своем клиенте, что запрос отменен, потому что сдох контекст
источник

J

Je in Go-go!
Конкретно с http2 я ловил кейс, когда
1) запрос уже выполнился и сервак его обработал
2) net/http отчитался, что запрос не выолнил, потому что сдох контекст

Если детально интересно, то проблема кроется здесь, здесь нигде до записи нет преждевременной проверки на context.Done, а в go в select нет гарантии очередности выполнения, в итоге на _уже_ дохлом контекте может начинаться запись body
https://github.com/golang/go/blob/212d385a2f723a8dd5e7d2e83efb478ddd139349/src/net/http/h2_bundle.go#L7677
Как короткий итог вышесказанного - вы контекст-то передавайте. Но имейте ввиду, что вам никто не гарантирует, что запрос не выполнится, только лишь гарантия, что когда-то на след цикле он все же отменится
источник

AB

Andrey Burov in Go-go!
ИМХО not a bug
источник

J

Je in Go-go!
Из этого причудливо наблюдать, если навесить retry-логику на ошибку canceled context, и заретраить в цикле - запросы все-таки будут раз через раз уходить, а клиент об этом не узнает
источник

J

Je in Go-go!
Ну вообще да, скорее причудливые подводные непредсказуемости в конкурентной среде) Просто не нужно как минимум ретраить ошибки canceled context - а периодически на подобное натыкаюсь в либах, даже таких как Stripe
https://github.com/stripe/stripe-go/issues/1184
источник

AB

Andrey Burov in Go-go!
просто если context уже Done, то ничего делать больше не надо
источник

Ⓥⓞⓥⓐ с троещины... in Go-go!
Распечатаю на стену
источник

J

Je in Go-go!
Как это гарантировать, через одну строчку в коде пповерки раскидать? Я показал, что даже net/http позволяет что-то сделать, и конкретно начать запись body
источник

AB

Andrey Burov in Go-go!
да зачем через строчку то, ну начал запись в body и ничего страшного от этого не произойдет
источник

J

Je in Go-go!
Произойдет, запрос улетает, если body в один цикл и записался, проверено
источник

AB

Andrey Burov in Go-go!
ну во первых в запросы нужно тоже ctx передавать, и если контекст уже всё... то запроса не будет
источник

AB

Andrey Burov in Go-go!
а во вторых, даже если выполнилось какое-то действие, что от этого меняется? юзер мог свалить как ДО начала выполнения какого-то действия, во время выполнения, так и СРАЗУ после...
источник

AB

Andrey Burov in Go-go!
context- это не ctrl^c
источник

J

Je in Go-go!
Я же говорю, что запрос именно что будет, можете убедиться и на заранее дохлом контексте ударить циклом запрсов с мелким body. Случаи, где в select проверка на Done будет второй после записи - запрос улетает
источник

AB

Andrey Burov in Go-go!
можете пример сделать?
источник

J

Je in Go-go!
Актуально для http2 из стдлиб, на другом не проверял
источник

J

Je in Go-go!
Если выше проследовать по issue, там прилинкован мой issue в го, но всем пофиг похоже, да и мне тоже, на http2 transport нет тестов в го, а я их писать с нуля и доказывать не собираюсь
источник