ProxyAgent можа хутка злучыцца, а затым бясконца чакаць цела адказу. Тайм-аўт злучэння вузла проксі не апісвае гэтае пазнейшае чаканне.

Задайце мяжу злучэння на вузле пры стварэнні агента. Для публічнага HTTP-запыту ніжэй неаўтэнтыфікаваны кандыдат са спісу HTTP-проксі можа замяніць адрас, калі публічныя пасярэднікі дазволены:

endpoint = TCP4ClientEndpoint(reactor, 'proxy.example', 8080,
                              timeout=5)
agent = ProxyAgent(endpoint, reactor=reactor)

Для невялікага адказу, які вы збіраецеся захоўваць у памяці, уключыце чытанне цела ў ланцуг Deferred перад даданнем крайняга тэрміну:

from twisted.web.client import readBody

d = agent.request(b'GET', b'http://example.com/')
d.addCallback(readBody)
d.addTimeout(10, reactor)
d.addCallback(lambda body: print(len(body)))
d.addErrback(lambda failure: print(failure.getErrorMessage()))

Фрагмент мяркуе, што праграма ўжо мае свой reactor і наладжаны агент. Deferred запыту ProxyAgent вяртае аб’ект адказу; readBody вяртае Deferred для цела. Вяртанне яго з callback прымушае ланцуг чакаць і гэтую аперацыю.

Размяшчэнне мае значэнне. Twisted прымяняе addTimeout да працы, якую прадстаўляюць callback, усталяваныя перад ім. Даданне чытача цела пасля гэтага апісала б іншую мяжу. У гэтым парадку таймер пачынаецца пры выкліку addTimeout і пакрывае чаканы запыт і працу з целам у гэтым ланцугу.

Выкарыстоўвайце патокавы спажывец для вялікіх або неабмежаваных цел і прадстаўляйце яго завяршэнне гэтак жа. Крайні тэрмін на баку кліента абмяжоўвае, як доўга чакае ваша праграма; ён не перанастройвае ўласны тайм-аўт злучэння проксі з верхнім патокам.

Падобныя артыкулы