日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

通过追源码解决:xmlrpc.client设定请求超时时间

發(fā)布時(shí)間:2025/3/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过追源码解决:xmlrpc.client设定请求超时时间 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、背景:

我們都知道,RPC本質(zhì)是一個(gè)代理模式,是在HTTP或HTTPS請(qǐng)求上面做的封裝,那么別人封裝好了,拿過(guò)來(lái)用就好了。這樣帶來(lái)了極大的遍歷,但也就導(dǎo)致了另外的問(wèn)題,有的時(shí)候就是不夠靈活。在python項(xiàng)目X山中,有的地方用了xmlrpc.client , 但又缺少超時(shí)機(jī)制。

二、分析

直接上代碼了

import xmlrpc.clienturl = 'http://{}:{}'.format("127.0.0.1", 5678) client = xmlrpc.client.ServerProxy(url) client.f11()


點(diǎn)進(jìn)去看看吧。在短短三行代碼中,我們只能夠發(fā)現(xiàn),只有后兩行,有機(jī)會(huì)傳一個(gè)超時(shí)參數(shù),再一看,倒數(shù)第一行,是自己定義的,那壓力來(lái)到了xmlrpc.client.ServerProxy(url)

class ServerProxy:def __init__(self, uri, transport=None, encoding=None, verbose=False,allow_none=False, use_datetime=False, use_builtin_types=False,*, headers=(), context=None):# establish a "logical" server connection# get the urltype, uri = urllib.parse._splittype(uri)if type not in ("http", "https"):raise OSError("unsupported XML-RPC protocol")self.__host, self.__handler = urllib.parse._splithost(uri)if not self.__handler:self.__handler = "/RPC2"if transport is None:if type == "https":handler = SafeTransportextra_kwargs = {"context": context}else:handler = Transportextra_kwargs = {}transport = handler(use_datetime=use_datetime,use_builtin_types=use_builtin_types,headers=headers,**extra_kwargs)self.__transport = transportself.__encoding = encoding or 'utf-8'self.__verbose = verboseself.__allow_none = allow_none

這個(gè)構(gòu)造函數(shù),把眼睛看花也看不到timeout字樣,于是搜了搜看到一種解決方案

xmlrpclib客戶端請(qǐng)求超時(shí)-python黑洞網(wǎng)

這老哥說(shuō)到人心坎,全局超時(shí)影響過(guò)于大了,但給的是python2的例子,而且包名和我的報(bào)名也有區(qū)別。

?

此事回頭再看transport參數(shù),

發(fā)現(xiàn)這個(gè)構(gòu)造方法里面也確實(shí)只有這個(gè)參數(shù)能掀起一些波瀾(這個(gè)結(jié)論存在馬后炮成分),并且再構(gòu)造方法里面出現(xiàn)了同名的類:Transport

因此,順著繼承重寫(xiě)方法的路往下走

Transport 類

代碼就不全部粘貼了,搞一部分下來(lái)

## # Standard transport class for XML-RPC over HTTP. # <p> # You can create custom transports by subclassing this method, and # overriding selected methods.class Transport:def make_connection(self, host):#return an existing connection if possible. This allows#HTTP/1.1 keep-alive.if self._connection and host == self._connection[0]:return self._connection[1]# create a HTTP connection object from a host descriptorchost, self._extra_headers, x509 = self.get_host_info(host)self._connection = host, http.client.HTTPConnection(chost)return self._connection[1]class HTTPConnection:def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,source_address=None, blocksize=8192): ?


關(guān)鍵點(diǎn)1:類前面的備注這里提示我們可以去繼承這個(gè)類
關(guān)鍵點(diǎn)2:方法里面的HTTPConnection也存在timeout參數(shù)

?

繼續(xù)順著這個(gè)思路往下,咱們看看socket._GLOBAL_DEFAULT_TIMEOUT到底是個(gè)啥

這就是個(gè)OBJECT? ????????按照我的預(yù)期,應(yīng)該是個(gè)數(shù)字.......?

給他打印出來(lái)看看

到這里,我覺(jué)得可能不用再追了,我的目標(biāo)是解決問(wèn)題,當(dāng)你設(shè)置為_(kāi)GLOBAL_DEFAULT_TIMEOUT, 那說(shuō)明就是無(wú)限等待的。

三、實(shí)踐

就按照這個(gè)思路,重寫(xiě)了Transport類

客戶端思路如下

import http.client import xmlrpc.clientclass TimeoutTransport(xmlrpc.client.Transport):time_out = 60 # 單位:秒def make_connection(self, host):# return an existing connection if possible. This allows# HTTP/1.1 keep-alive.if self._connection and host == self._connection[0]:return self._connection[1]# create a HTTP connection object from a host descriptorchost, self._extra_headers, x509 = self.get_host_info(host)self._connection = host, http.client.HTTPConnection(chost, timeout=self.time_out)return self._connection[1]def set_timeout(self, timeout):self.time_out = timeouturl = 'http://{}:{}'.format("127.0.0.1", 5678) try:client = xmlrpc.client.ServerProxy(url, transport=TimeoutTransport())client.f11() except Exception as e:print(e) print("--------------------------") try:client2 = xmlrpc.client.ServerProxy(url)client2.f11() except Exception as e:print(e)

import sys import time from socketserver import ThreadingMixIn from xmlrpc.server import SimpleXMLRPCServerclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):name = "xml-server"def f11():print("老子睡了")time.sleep(10000)print("老子醒了")return 11server = ThreadXMLRPCServer(('0.0.0.0', 5678)) server.register_function(f11, "f11") server.serve_forever()

四、測(cè)試

server日志

客戶端日志:

若是不手動(dòng)停止,怕是永遠(yuǎn)也等不到了呢~

?

?

總結(jié)

以上是生活随笔為你收集整理的通过追源码解决:xmlrpc.client设定请求超时时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av毛片在线 | 黄色中文字幕在线观看 | 真性中出 | 黄色a一级| 操欧美美女 | 国产91专区 | 午夜大片 | 欧洲精品一区二区 | 欧美视频在线不卡 | 97福利视频| 久久蜜桃av | 久久一二区 | 免费无遮挡网站 | 日日做夜夜爽毛片麻豆 | 日韩av手机在线观看 | 久久激情av | 欧美极品在线播放 | 国产片在线播放 | 成人无码精品1区2区3区免费看 | www.自拍| 欧美激情在线播放 | a激情| 人妻丝袜一区 | 91伦理在线 | v8888av| 欧美韩国日本在线 | 一区二区免费在线播放 | 性色在线观看 | 99热91| 黄色在线观看网站 | 国产精品欧美精品 | 亚洲天堂社区 | 成 年 人 黄 色 大 片大 全 | 草草福利影院 | 欧美人妻精品一区二区三区 | 人妻互换一区二区三区四区五区 | 久久精品国产亚洲av无码娇色 | 久久久久久久一区二区 | 日韩在线观看视频免费 | 丰满人妻翻云覆雨呻吟视频 | 秘密的基地 | 钻石午夜影院 | 啪啪一区二区 | 成年人免费小视频 | 亚洲好骚综合 | av网址免费| 国产传媒在线观看 | 性开放的欧美大片 | 国产农村妇女精品一区二区 | 久久久久欧美 | 欧美男女视频 | 午夜黄色录像 | 性色综合 | 初尝黑人巨炮波多野结衣 | 日本人妖xxxx | 欧美成人片在线 | 久久亚洲区 | 91丝袜在线 | 黄一区二区三区 | 新97超碰 | 男女网站视频 | 国产又粗又黄又猛 | 亚洲作爱视频 | 在线观看中文字幕第一页 | 91免费视频网 | 桃色视频在线 | 麻豆传媒网站 | 免费三片在线观看网站v888 | 三女警花合力承欢猎艳都市h | 国产一在线 | 五月网婷婷 | 日本黄色片在线播放 | 成人精品免费看 | 口舌奴vk| 午夜视频久久 | 人妻激情偷乱频一区二区三区 | 国产精品久久久久久久久久久久久 | 国产一级片免费播放 | 视频在线亚洲 | 欧美脚交视频 | 国产一区二区不卡视频 | 精品国产一区二区三区久久久蜜臀 | 天天躁日日摸久久久精品 | 国产欧美一区在线观看 | 久久精品无码人妻 | 成人在线观看网 | 国产精品无码人妻一区二区在线 | 亚洲一二三区在线 | 中文字幕在线观看第一页 | 国产成人麻豆免费观看 | 一区二区三区在线观看av | 国产综合视频一区二区 | 狠狠干青青草 | 97国产在线观看 | 夜夜骚av | 色狠狠久久av大岛优香 | 欧美一区自拍 | 秋霞午夜鲁丝一区二区 | 国产欧美一区二区三区在线看蜜臀 |