热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tensorflowtfserving进行warmup设置

最近发现模型在更新的一瞬间容易产生超时的问题,于是就了解了一下tf-serving中有个warmup主要是通过模型启动时加载${model}${version}ass

最近发现模型在更新的一瞬间容易产生超时的问题,于是就了解了一下 tf-serving 中有个warmup主要是通过模型启动时加载${model}/${version}/assets.extra/tf_serving_warmup_requests达到热启动的目的,使得模型更新时不易产生超时的问题

首先根据自己的模型字段进行编写形成tf_serving_warmup_requests文件,server就是tf-serving的机器加端口号,,在导出模型时和warmup文件一起导出

以下是我warmup文件生成代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: supeihuang
# Time: 2019/9/5 9:33import numpy
import tensorflow as tf
from tensorflow_serving.apis import model_pb2
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_log_pb2
from tensorflow_serving.apis import prediction_service_pb2
from grpc.beta import implementations
import grpc
import tensorflow as tf
from tensorflow_serving.apis import prediction_service_pb2_grpc
import datetimetf.app.flags.DEFINE_string('server', '47.93.217.40:31220','PredictionService host:port')tf.app.flags.DEFINE_string('model', 'din_pregrant_posts_3','Model name.')
FLAGS = tf.app.flags.FLAGS_CSV_COLUMNS =["labels", "userId", "itemId","userEntrance", "userRequestTime", "userRequestWeek", "userOs", "userApn","userUa",#9"userMode", "userProvince", "userCity", "userCityLevel", "userMarr", "userAge","userGestat_week","userAgeRange", "userBage", "userAppV",#10"userCliN_Inc", "userShoN_Inc", "userBotActCt","userTotalTime", "userView2BottomTimes", "userEffTimes", "userFirstRequest", "userAppLTag", "userHisL",#9"itemAlgSource", "itemTexL", "itemKwN", "itemTitL", "itemTwN", "itemImgN", "itemSour", "itemCreT", "itemCliN_Inc","itemShoN_Inc",#10"itemRevi", "itemColN","itemShare", "itemVreN", "itemLireN", "itemLike", "itemEffUsers", "itemView2BottomTimes", "itemTotalTime","itemBotSum","itemMt",#11"itemContentH", "itemCtr", "itemAvsT", "itemFiR", "itemTimeScore", "itemBotSumCliR", "itemSexW","itemSuperstiW","itemLowTitleW",#9"itemTtP","itemKtW", "itemKtW2", "itemTag1", "itemTag2", "itemTag3", "itemKs1", "itemKs2",#7"userItemHistory", "userKeywordHistory", "userKeyword2History","userTag1History", "userTag2History", "userTag3History", "userKs1History", "userKs2History","userKtW","userTtP"]#10#10个 userItemHistory可有可无
_COLUMNS_NEED_SPILIT = ["userItemHistory", "userKeywordHistory", "userKeyword2History", "userTag1History","userTag2History", "userTag3History", "userKs1History", "userKs2History"]def main():# create the RPC stub# channel = implementations.insecure_channel("127.0.0.1", int(8502))# stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)## # create the request object and set the name and signature_name params# request = predict_pb2.PredictRequest()# request.model_spec.name = &#39;din&#39;# request.model_spec.signature_name = &#39;predict&#39;channel = grpc.insecure_channel(FLAGS.server)stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)request = predict_pb2.PredictRequest()print(FLAGS.model)request.model_spec.name = FLAGS.modelrequest.model_spec.signature_name = &#39;serving_default&#39;requests = []file = open("209", &#39;r&#39;, encoding=&#39;UTF-8&#39;)i = 0try:while True and (i <200):text_line = file.readline()if text_line:a = eval(text_line)b = {}for j in range(76):b[_CSV_COLUMNS[j]] = [a[j]]i = i + 1print("b:",b)c = [&#39;userKeywordHistory&#39;,&#39;userKeyword2History&#39;,&#39;userTag1History&#39;,
&#39;userTag2History&#39;,&#39;userTag3History&#39;,&#39;userKs1History&#39;,&#39;userKs2History&#39;,"userTtP","userKtW"]for item in c:print("item:",item)tmp = b[item]print("tmp:",tmp)if tmp[0] is not &#39;&#39;:b[item] = [list(eval(tmp[0]))]else:b[item]=tmp[0]# print(b[&#39;userTag1History&#39;])requests.append(b)else:breakfinally:file.close()# read file and get valuenum = 1with tf.io.TFRecordWriter("tf_serving_warmup_requests") as writer:for i in range(0, 1):request = predict_pb2.PredictRequest(model_spec=model_pb2.ModelSpec(name="din_pregrant_posts_3", signature_name="serving_default"),inputs={# "time_weight": tf.make_tensor_proto([10] * num, shape=[num],# dtype=tf.int32),"userEntrance": tf.make_tensor_proto(requests[i][&#39;userEntrance&#39;] * num,shape=[num] , dtype=tf.int32),"userRequestTime": tf.make_tensor_proto(requests[i][&#39;userRequestTime&#39;] * num,shape=[num] ,dtype=tf.int32),"userRequestWeek": tf.make_tensor_proto(requests[i][&#39;userRequestWeek&#39;]* num,shape=[num] , dtype=tf.int32),"userOs": tf.make_tensor_proto(requests[i][&#39;userOs&#39;]* num,shape=[num] , dtype=tf.int32),"userApn": tf.make_tensor_proto(requests[i][&#39;userApn&#39;]* num,shape=[num] , dtype=tf.int32),"userUa": tf.make_tensor_proto(requests[i][&#39;userUa&#39;]* num,shape=[num] , dtype=tf.int32),"userMode": tf.make_tensor_proto(requests[i][&#39;userMode&#39;]* num,shape=[num] , dtype=tf.int32),"userProvince": tf.make_tensor_proto(requests[i][&#39;userProvince&#39;]* num,shape=[num] , dtype=tf.int32),"userCity": tf.make_tensor_proto(requests[i][&#39;userCity&#39;]* num,shape=[num] , dtype=tf.int32),"userCityLevel": tf.make_tensor_proto(requests[i][&#39;userCityLevel&#39;]* num,shape=[num] , dtype=tf.int32),"userMarr": tf.make_tensor_proto(requests[i][&#39;userMarr&#39;]* num,shape=[num] , dtype=tf.int32),"userAge": tf.make_tensor_proto(requests[i][&#39;userAge&#39;]* num,shape=[num] , dtype=tf.int32),"userGestat_week": tf.make_tensor_proto(requests[i][&#39;userGestat_week&#39;]* num,shape=[num], dtype=tf.int32),"userAgeRange": tf.make_tensor_proto(requests[i][&#39;userAgeRange&#39;]* num,shape=[num] , dtype=tf.int32),"userBage": tf.make_tensor_proto(requests[i][&#39;userBage&#39;]* num,shape=[num] , dtype=tf.int32),"userAppV": tf.make_tensor_proto(requests[i][&#39;userAppV&#39;]* num,shape=[num] , dtype=tf.int32),"userCliN_Inc": tf.make_tensor_proto(requests[i][&#39;userCliN_Inc&#39;]* num,shape=[num] , dtype=tf.int32),"userShoN_Inc": tf.make_tensor_proto(requests[i][&#39;userShoN_Inc&#39;]* num,shape=[num] , dtype=tf.int32),"userBotActCt": tf.make_tensor_proto(requests[i][&#39;userBotActCt&#39;]* num,shape=[num] , dtype=tf.int32),"userTotalTime": tf.make_tensor_proto(requests[i][&#39;userTotalTime&#39;]* num,shape=[num] , dtype=tf.int32),"userView2BottomTimes": tf.make_tensor_proto(requests[i][&#39;userView2BottomTimes&#39;]* num,shape=[num] , dtype=tf.int32),"userEffTimes": tf.make_tensor_proto(requests[i][&#39;userEffTimes&#39;]* num,shape=[num] , dtype=tf.int32),"userFirstRequest": tf.make_tensor_proto(requests[i][&#39;userFirstRequest&#39;]* num,shape=[num] , dtype=tf.int32),"userAppLTag": tf.make_tensor_proto(requests[i][&#39;userAppLTag&#39;]* num,shape=[num] , dtype=tf.int32),"itemAlgSource": tf.make_tensor_proto(requests[i][&#39;itemAlgSource&#39;]* num,shape=[num] , dtype=tf.int32),"itemTexL": tf.make_tensor_proto(requests[i][&#39;itemTexL&#39;]* num,shape=[num] , dtype=tf.int32),"itemKwN": tf.make_tensor_proto(requests[i][&#39;itemKwN&#39;]* num,shape=[num] , dtype=tf.int32),"itemTitL": tf.make_tensor_proto(requests[i][&#39;itemTitL&#39;]* num,shape=[num] , dtype=tf.int32),"itemTwN": tf.make_tensor_proto(requests[i][&#39;itemTwN&#39;]* num,shape=[num] , dtype=tf.int32),"itemImgN": tf.make_tensor_proto(requests[i][&#39;itemImgN&#39;]* num,shape=[num] , dtype=tf.int32),"itemSour": tf.make_tensor_proto(requests[i][&#39;itemSour&#39;]* num,shape=[num] , dtype=tf.int32),"itemCreT": tf.make_tensor_proto(requests[i][&#39;itemCreT&#39;]* num,shape=[num] , dtype=tf.int32),"itemCliN_Inc": tf.make_tensor_proto(requests[i][&#39;itemCliN_Inc&#39;]* num,shape=[num] , dtype=tf.int32),"itemShoN_Inc": tf.make_tensor_proto(requests[i][&#39;itemShoN_Inc&#39;]* num,shape=[num] , dtype=tf.int32),"itemRevi": tf.make_tensor_proto(requests[i][&#39;itemRevi&#39;]* num,shape=[num] , dtype=tf.int32),"itemColN": tf.make_tensor_proto(requests[i][&#39;itemColN&#39;]* num,shape=[num] , dtype=tf.int32),"itemShare": tf.make_tensor_proto(requests[i][&#39;itemShare&#39;]* num,shape=[num] , dtype=tf.int32),"itemVreN": tf.make_tensor_proto(requests[i][&#39;itemVreN&#39;]* num,shape=[num] , dtype=tf.int32),"itemLireN": tf.make_tensor_proto(requests[i][&#39;itemLireN&#39;]* num,shape=[num] , dtype=tf.int32),"itemLike": tf.make_tensor_proto(requests[i][&#39;itemLike&#39;]* num,shape=[num] , dtype=tf.int32),"itemEffUsers": tf.make_tensor_proto(requests[i][&#39;itemEffUsers&#39;]* num,shape=[num] , dtype=tf.int32),"itemView2BottomTimes": tf.make_tensor_proto(requests[i][&#39;itemView2BottomTimes&#39;]* num,shape=[num] , dtype=tf.int32),"itemTotalTime": tf.make_tensor_proto(requests[i][&#39;itemTotalTime&#39;]* num,shape=[num] , dtype=tf.int32),"itemBotSum": tf.make_tensor_proto(requests[i][&#39;itemBotSum&#39;]* num,shape=[num] , dtype=tf.int32),"itemMt": tf.make_tensor_proto(requests[i][&#39;itemMt&#39;] * num, shape=[num], dtype=tf.int32),"itemContentH": tf.make_tensor_proto(requests[i][&#39;itemContentH&#39;]* num,shape=[num] , dtype=tf.double),"itemCtr": tf.make_tensor_proto(requests[i][&#39;itemCtr&#39;]* num,shape=[num] , dtype=tf.double),"itemAvsT": tf.make_tensor_proto(requests[i][&#39;itemAvsT&#39;]* num,shape=[num] , dtype=tf.double),"itemFiR": tf.make_tensor_proto(requests[i][&#39;itemFiR&#39;]* num,shape=[num] , dtype=tf.double),"itemTimeScore": tf.make_tensor_proto(requests[i][&#39;itemTimeScore&#39;]* num,shape=[num] , dtype=tf.double),"itemBotSumCliR": tf.make_tensor_proto(requests[i][&#39;itemBotSumCliR&#39;]* num,shape=[num] , dtype=tf.double),"itemSexW": tf.make_tensor_proto(requests[i][&#39;itemSexW&#39;]* num,shape=[num] , dtype=tf.double),"itemSuperstiW": tf.make_tensor_proto(requests[i][&#39;itemSuperstiW&#39;]* num,shape=[num] , dtype=tf.double),"itemLowTitleW": tf.make_tensor_proto(requests[i][&#39;itemLowTitleW&#39;]* num,shape=[num] , dtype=tf.double),"itemKtW": tf.make_tensor_proto(requests[i][&#39;itemKtW&#39;]* num,shape=[num] , dtype=tf.int32),"itemKtW2": tf.make_tensor_proto(requests[i][&#39;itemKtW2&#39;]* num,shape=[num] , dtype=tf.int32),"itemTag1": tf.make_tensor_proto(requests[i][&#39;itemTag1&#39;]* num,shape=[num] , dtype=tf.int32),"itemTag2": tf.make_tensor_proto(requests[i][&#39;itemTag2&#39;]* num,shape=[num] , dtype=tf.int32),"itemTag3": tf.make_tensor_proto(requests[i][&#39;itemTag3&#39;]* num,shape=[num] , dtype=tf.int32),"itemKs1": tf.make_tensor_proto(requests[i][&#39;itemKs1&#39;]* num,shape=[num] , dtype=tf.int32),"itemKs2": tf.make_tensor_proto(requests[i][&#39;itemKs2&#39;] * num, shape=[num], dtype=tf.int32),"userKeywordHistory": tf.make_tensor_proto(requests[i][&#39;userKeywordHistory&#39;] * num ,shape=[num,requests[i][&#39;userHisL&#39;][0]], dtype=tf.int32),"userKeyword2History": tf.make_tensor_proto(requests[i][&#39;userKeyword2History&#39;]* num,shape=[num,requests[i][&#39;userHisL&#39;][0]], dtype=tf.int32),"userTag1History": tf.make_tensor_proto(requests[i][&#39;userTag1History&#39;]* num,shape=[num,requests[i][&#39;userHisL&#39;][0]], dtype=tf.int32),"userTag2History": tf.make_tensor_proto(requests[i][&#39;userTag2History&#39;]* num,shape=[num,requests[i][&#39;userHisL&#39;][0]], dtype=tf.int32),"userTag3History": tf.make_tensor_proto(requests[i][&#39;userTag3History&#39;]* num,shape=[num,requests[i][&#39;userHisL&#39;][0]], dtype=tf.int32),"userKs1History": tf.make_tensor_proto(requests[i][&#39;userKs1History&#39;]* num,shape=[num,requests[i][&#39;userHisL&#39;][0]], dtype=tf.int32),"userKs2History": tf.make_tensor_proto(requests[i][&#39;userKs2History&#39;]* num, shape=[num,requests[i][&#39;userHisL&#39;][0]],dtype=tf.int32),# "userTtP": tf.make_tensor_proto(requests[i][&#39;userTtP&#39;]* num,shape=[num,requests[i][&#39;userHisL&#39;][0]], dtype=tf.int32),# "userKtW": tf.make_tensor_proto(requests[i][&#39;userKtW&#39;]* num, shape=[num,requests[i][&#39;userHisL&#39;][0]],dtype=tf.int32),"userHisL": tf.make_tensor_proto(requests[i][&#39;userHisL&#39;] * num, shape=[num], dtype=tf.int32),})log = prediction_log_pb2.PredictionLog(predict_log=prediction_log_pb2.PredictLog(request=request))writer.write(log.SerializeToString())print(request)print(requests[i][&#39;userKeywordHistory&#39;])time_start = datetime.datetime.utcnow()for i in range(1000):respOnse= stub.Predict.future(request, 30.)time_end = datetime.datetime.utcnow()time_elapsed_sec = (time_end - time_start).total_seconds()print(&#39;Total elapsed time: {} seconds&#39;.format(time_elapsed_sec))print(&#39;Time for batch size {} repeated {} times&#39;.format(1, 1000))print(&#39;Average latency per batch: {} seconds&#39;.format(time_elapsed_sec / 1000))print(response)prediction = response.result()print(prediction)if __name__ == "__main__":main()

导出模型是的代码如下

def export_model(model, export_dir, checkpoint_path):"""Export to SavedModel format.Args:model_din: Estimator objectexport_dir: directory to export the model_din.model_column_fn: Function to generate model_din feature columns."""#54个特征feature_name = [ &#39;userEntrance&#39;, &#39;userRequestTime&#39;, &#39;userRequestWeek&#39;, &#39;userOs&#39;, &#39;userApn&#39;, &#39;userUa&#39;,&#39;userMode&#39;, &#39;userProvince&#39;, &#39;userCity&#39;, &#39;userCityLevel&#39;,&#39;userMarr&#39;, &#39;userAge&#39;,&#39;userGestat_week&#39;, &#39;userAgeRange&#39;, &#39;userBage&#39;, &#39;userAppV&#39;, &#39;userCliN_Inc&#39;, &#39;userShoN_Inc&#39;, &#39;userBotActCt&#39;, &#39;userTotalTime&#39;,&#39;userView2BottomTimes&#39;, &#39;userEffTimes&#39;, &#39;userFirstRequest&#39;, &#39;userAppLTag&#39;, &#39;itemAlgSource&#39;, &#39;itemTexL&#39;, &#39;itemKwN&#39;, &#39;itemTitL&#39;, &#39;itemTwN&#39;,&#39;itemImgN&#39;,&#39;itemSour&#39;, &#39;itemCreT&#39;, &#39;itemCliN_Inc&#39;, &#39;itemShoN_Inc&#39;, &#39;itemRevi&#39;, &#39;itemColN&#39;, &#39;itemShare&#39;, &#39;itemVreN&#39;, &#39;itemLireN&#39;, &#39;itemLike&#39;,&#39;itemEffUsers&#39;, &#39;itemView2BottomTimes&#39;,&#39;itemTotalTime&#39;, &#39;itemBotSum&#39;,&#39;itemMt&#39;,&#39;itemContentH&#39;, &#39;itemCtr&#39;, &#39;itemAvsT&#39;, &#39;itemFiR&#39;, &#39;itemTimeScore&#39;,&#39;itemBotSumCliR&#39;,&#39;itemSexW&#39;,&#39;itemSuperstiW&#39;, &#39;itemLowTitleW&#39;]serving_features = {}for item in feature_name:double_feature = ["itemContentH", "itemCtr", "itemAvsT", "itemFiR", "itemTimeScore","itemBotSumCliR", "itemSexW", "itemSuperstiW", "itemLowTitleW"]if item in double_feature:serving_features[item] = tf.placeholder(tf.double, [None, ], name=item)else:serving_features[item] = tf.placeholder(tf.int32, [None, ], name=item)#18个serving_features1 = {# "itemTtp": tf.placeholder(tf.int32, [None, ], name=&#39;itemTtp&#39;),"itemKtW": tf.placeholder(tf.int32, [None, ], name=&#39;keyword&#39;),"itemKtW2": tf.placeholder(tf.int32, [None, ], name=&#39;keyword2&#39;),"itemTag1": tf.placeholder(tf.int32, [None, ], name=&#39;tag1&#39;),"itemTag2": tf.placeholder(tf.int32, [None, ], name=&#39;tag2&#39;),"itemTag3": tf.placeholder(tf.int32, [None, ], name=&#39;tag3&#39;),"itemKs1": tf.placeholder(tf.int32, [None, ], name=&#39;ks1&#39;),"itemKs2": tf.placeholder(tf.int32, [None, ], name=&#39;ks2&#39;),"userKeywordHistory": tf.placeholder(tf.int32, [None, None], name=&#39;hist_keyword&#39;),"userKeyword2History": tf.placeholder(tf.int32, [None, None], name=&#39;hist_keyword2&#39;),"userTag1History": tf.placeholder(tf.int32, [None, None], name=&#39;hist_tag1&#39;),"userTag2History": tf.placeholder(tf.int32, [None, None], name=&#39;hist_tag2&#39;),"userTag3History": tf.placeholder(tf.int32, [None, None], name=&#39;hist_tag3&#39;),"userKs1History": tf.placeholder(tf.int32, [None, None], name=&#39;hist_ks1&#39;),"userKs2History": tf.placeholder(tf.int32, [None, None], name=&#39;hist_ks2&#39;),# "userTtP": tf.placeholder(tf.int32, [None, None], name=&#39;userTtP&#39;),# "userKtW": tf.placeholder(tf.int32, [None, None], name=&#39;userKtW&#39;),"userHisL": tf.placeholder(tf.int32, [None, ], name=&#39;sl&#39;)}serving_features.update(serving_features1)#构建一个serving_input_receiver_fn期望特征张量example_input_fn = (tf.estimator.export.build_raw_serving_input_receiver_fn(serving_features))# 导出为Tensorflow SavedModelreturn model.export_savedmodel(export_dir, example_input_fn, checkpoint_path=checkpoint_path,assets_extra={&#39;tf_serving_warmup_requests&#39;: &#39;/data/supeihuang/din_209_data/data_item/tf_serving_warmup_requests&#39;})

 


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
author-avatar
tuiqiu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有