前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[CentOS 7 Python 7 升级...]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
转载文章
...一,这里不仅有详尽的教程指导,还有众多开发者分享的一线实践经验,帮助你更好地掌握oneAPI,并将其应用于解决复杂计算问题和应对未来挑战。
2023-07-22 10:28:50
321
转载
Apache Solr
...确的结果了。我们使用Python和requests库来模拟这个过程: python import requests from solr import SolrClient solr_url = "http://localhost:8983/solr/core1" solr_client = SolrClient(solr_url) def search(query): results = solr_client.search(query) for result in results: 外部API请求 external_data = fetch_external_metadata(result['id']) result['additional_info'] = external_data return results def fetch_external_metadata(doc_id): url = f"https://example.com/api/{doc_id}" response = requests.get(url) if response.status_code == 200: return response.json() else: return None 在这个例子中,fetch_external_metadata函数尝试从外部API获取元数据,如果请求失败或API不可用,那么该结果将被标记为未获取到数据。当外部服务出现延迟或中断时,这将直接影响到Solr的查询效率。 三、优化策略 1. 缓存策略 为了避免频繁请求外部服务,可以引入缓存机制。对于频繁访问且数据变化不大的元数据,可以在本地缓存一段时间。当外部服务不可用时,可以回退使用缓存数据,直到服务恢复。 python class ExternalMetadataCache: def __init__(self, ttl=600): self.cache = {} self.ttl = ttl def get(self, doc_id): if doc_id not in self.cache or (self.cache[doc_id]['timestamp'] + self.ttl) < time.time(): self.cache[doc_id] = {'data': fetch_external_metadata(doc_id), 'timestamp': time.time()} return self.cache[doc_id]['data'] metadata_cache = ExternalMetadataCache() def fetch_external_metadata_safe(doc_id): return metadata_cache.get(doc_id) 2. 重试机制 在请求外部服务时添加重试逻辑,当第一次请求失败后,可以设置一定的时间间隔后再次尝试,直到成功或达到最大重试次数。 python def fetch_external_metadata_retriable(doc_id, max_retries=3, retry_delay=5): for i in range(max_retries): try: return fetch_external_metadata(doc_id) except Exception as e: print(f"Attempt {i+1} failed with error: {e}. Retrying in {retry_delay} seconds...") time.sleep(retry_delay) raise Exception("Max retries reached.") 四、结论与展望 通过上述策略,我们可以在一定程度上减轻外部服务依赖对Solr性能的影响。然而,重要的是要持续监控系统的运行状况,并根据实际情况调整优化措施。嘿,你听说了吗?科技这玩意儿啊,那可是越来越牛了!你看,现在就有人在琢磨怎么对付那些让人上瘾的东西。将来啊,说不定能搞出个既高效又结实的办法,帮咱们摆脱这个烦恼。想想都挺激动的,对吧?哎呀,兄弟!构建一个稳定又跑得快的搜索系统,那可得好好琢磨琢磨外部服务这事儿。你知道的,这些服务就像是你家里的电器,得选对了,用好了,整个家才能舒舒服服的。所以啊,咱们得先搞清楚这些服务都是干啥的,它们之间怎么配合,还有万一出了点小状况,咱们能不能快速应对。这样,咱们的搜索系统才能稳如泰山,嗖嗖地飞快,用户一搜就满意,那才叫真本事呢! --- 请注意,以上代码示例是基于Python和相关库编写的,实际应用时需要根据具体环境和技术栈进行相应的调整。
2024-09-21 16:30:17
39
风轻云淡
MemCache
...其基本用法: python from pymemcache.client import base 创建MemCache客户端连接 client = base.Client(('localhost', 11211)) 缓存一个值 client.set('key', 'value') 从缓存中获取值 print(client.get('key')) 删除缓存中的值 client.delete('key') 5. 避免MutexException的策略 解决MutexException的关键在于正确管理互斥锁。以下是一些实用的策略: a. 使用原子操作 MemCache提供了原子操作,如add、replace、increment等,可以安全地执行更新操作而无需额外的锁保护。 b. 线程安全编程 确保所有涉及到共享资源的操作都是线程安全的。这意味着避免在多线程环境中直接访问全局变量或共享资源,而是使用线程本地存储或其他线程安全的替代方案。 c. 锁优化 合理使用锁。哎呀,你懂的,有时候网站或者应用里头有些东西经常被大家看,但是实际上内容变动不多。这时候,为了不让系统在处理这些信息的时候卡壳太久,我们可以用个叫做“读锁”的小技巧。简单来说,读锁就像是图书馆里的书,大家都想翻阅,但是不打算乱动它,所以不需要特别紧锁起来,这样能提高大家看书的效率,也避免了不必要的等待。此外,考虑使用更高效的锁实现,比如使用更细粒度的锁或非阻塞算法。 d. 锁超时 在获取锁时设置超时时间,避免无限等待。哎呀,如果咱们在规定的时间内没拿到钥匙(这里的“锁”就是需要获得的权限或资源),那咱们就得想点别的办法了。比如说,咱们可以先把手头的事情放一放,退一步海阔天空嘛,回头再试试;或者干脆来个“再来一次”,看看运气是不是转了一把。别急,总有办法解决问题的! 6. 结语 MemCache的未来与挑战 随着技术的发展,MemCache面临着更多的挑战,包括更高的并发处理能力、更好的跨数据中心一致性以及对新兴数据类型的支持。然而,通过持续优化互斥锁管理策略,我们可以有效地避免MutexException等并发相关问题,让MemCache在高性能缓存系统中发挥更大的作用。嘿,小伙伴们!在咱们的编程路上,要记得跟紧时代步伐,多看看那些最棒的做法和新出炉的技术。这样,咱们就能打造出既稳固又高效的超级应用了!别忘了,技术这玩意儿,就像个不停奔跑的小兔子,咱们得时刻准备着,跟上它的节奏,不然可就要被甩在后面啦!所以,多学习,多实践,咱们的编程技能才能芝麻开花节节高!
2024-09-02 15:38:39
38
人生如戏
转载文章
...啊 这次我来写一下 Python 一个很重要的东西,即 Descriptor (描述符) 初识描述符 老规矩, Talk is cheap,Show me the code. 我们先来看看一段代码classPerson(object): """""" ---------------------------------------------------------------------- def__init__(self, first_name, last_name): """Constructor""" self.first_name = first_name self.last_name = last_name ---------------------------------------------------------------------- @property deffull_name(self): """ Return the full name """ return"%s %s"% (self.first_name, self.last_name) if__name__=="__main__": person = Person("Mike","Driscoll") print(person.full_name) 'Mike Driscoll' print(person.first_name) 'Mike' 这段代大家肯定很熟悉,恩, property 嘛,谁不知道呢,但是 property 的实现机制大家清楚么?什么不清楚?那还学个毛的 Python 啊。。。开个玩笑,我们看下面一段代码classProperty(object): "Emulate PyProperty_Type() in Objects/descrobject.c" def__init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel ifdocisNoneandfgetisnotNone: doc = fget.__doc__ self.__doc__ = doc def__get__(self, obj, objtype=None): ifobjisNone: returnself ifself.fgetisNone: raiseAttributeError("unreadable attribute") returnself.fget(obj) def__set__(self, obj, value): ifself.fsetisNone: raiseAttributeError("can't set attribute") self.fset(obj, value) def__delete__(self, obj): ifself.fdelisNone: raiseAttributeError("can't delete attribute") self.fdel(obj) defgetter(self, fget): returntype(self)(fget, self.fset, self.fdel, self.__doc__) defsetter(self, fset): returntype(self)(self.fget, fset, self.fdel, self.__doc__) defdeleter(self, fdel): returntype(self)(self.fget, self.fset, fdel, self.__doc__) 看起来是不是很复杂,没事,我们来一步步的看。不过这里我们首先给出一个结论: Descriptors 是一种特殊 的对象,这种对象实现了 __get__ , __set__ , __delete__ 这三个特殊方法。 详解描述符 说说 Property 在上文,我们给出了 Propery 实现代码,现在让我们来详细说说这个classPerson(object): """""" ---------------------------------------------------------------------- def__init__(self, first_name, last_name): """Constructor""" self.first_name = first_name self.last_name = last_name ---------------------------------------------------------------------- @Property deffull_name(self): """ Return the full name """ return"%s %s"% (self.first_name, self.last_name) if__name__=="__main__": person = Person("Mike","Driscoll") print(person.full_name) 'Mike Driscoll' print(person.first_name) 'Mike' 首先,如果你对装饰器不了解的话,你可能要去看看这篇文章,简而言之,在我们正式运行代码之前,我们的解释器就会对我们的代码进行一次扫描,对涉及装饰器的部分进行替换。类装饰器同理。在上文中,这段代码@Property deffull_name(self): """ Return the full name """ return"%s %s"% (self.first_name, self.last_name) 会触发这样一个过程,即 full_name=Property(full_name) 。然后在我们后面所实例化对象之后我们调用 person.full_name 这样一个过程其实等价于 person.full_name.__get__(person) 然后进而触发 __get__() 方法里所写的 return self.fget(obj) 即原本上我们所编写的 def full_name 内的执行代码。 这个时候,同志们可以去思考下 getter() , setter() ,以及 deleter() 的具体运行机制了=。=如果还是有问题,欢迎在评论里进行讨论。 关于描述符 还记得之前我们所提到的一个定义么: Descriptors 是一种特殊的对象,这种对象实现了 __get__ , __set__ , __delete__ 这三个特殊方法 。然后在 Python 官方文档的说明中,为了体现描述符的重要性,有这样一段话:“They are the mechanism behind properties, methods, static methods, class methods, and super(). They are used throughout Python itself to implement the new style classes introduced in version 2.2. ” 简而言之就是 先有描述符后有天,秒天秒地秒空气 。恩,在新式类中,属性,方法调用,静态方法,类方法等都是基于描述符的特定使用。 OK,你可能想问,为什么描述符是这么重要呢?别急,我们接着看 使用描述符 首先请看下一段代码 classA(object):注:在 Python 3.x 版本中,对于 new class 的使用不需要显式的指定从 object 类进行继承,如果在 Python 2.X(x>2)的版本中则需要defa(self): pass if__name__=="__main__": a=A() a.a() 大家都注意到了我们存在着这样一个语句 a.a() ,好的,现在请大家思考下,我们在调用这个方法的时候发生了什么? OK?想出来了么?没有?好的我们继续 首先我们调用一个属性的时候,不管是成员还是方法,我们都会触发这样一个方法用于调用属性 __getattribute__() ,在我们的 __getattribute__() 方法中,如果我们尝试调用的属性实现了我们的描述符协议,那么会产生这样一个调用过程 type(a).__dict__['a'].__get__(b,type(b)) 。好的这里我们又要给出一个结论了:“在这样一个调用过程中,有这样一个优先级顺序,如果我们所尝试调用属性是一个 data descriptors ,那么不管这个属性是否存在我们的实例的 __dict__ 字典中,优先调用我们描述符里的 __get__ 方法,如果我们所尝试调用属性是一个 non data descriptors ,那么我们优先调用我们实例里的 __dict__ 里的存在的属性,如果不存在,则依照相应原则往上查找我们类,父类中的 __dict__ 中所包含的属性,一旦属性存在,则调用 __get__ 方法,如果不存在则调用 __getattr__() 方法”。理解起来有点抽象?没事,我们马上会讲,不过在这里,我们先要解释下 data descriptors 与 non data descriptors ,再来看一个例子。什么是 data descriptors 与 non data descriptors 呢?其实很简单,在描述符中同时实现了 __get__ 与 __set__ 协议的描述符是 data descriptors ,如果只实现了 __get__ 协议的则是 non data descriptors 。好了我们现在来看个例子:importmath classlazyproperty: def__init__(self, func): self.func = func def__get__(self, instance, owner): ifinstanceisNone: returnself else: value = self.func(instance) setattr(instance, self.func.__name__, value) returnvalue classCircle: def__init__(self, radius): self.radius = radius pass @lazyproperty defarea(self): print("Com") returnmath.pi self.radius 2 deftest(self): pass if__name__=='__main__': c=Circle(4) print(c.area) 好的,让我们仔细来看看这段代码,首先类描述符 @lazyproperty 的替换过程,前面已经说了,我们不在重复。接着,在我们第一次调用 c.area 的时候,我们首先查询实例 c 的 __dict__ 中是否存在着 area 描述符,然后发现在 c 中既不存在描述符,也不存在这样一个属性,接着我们向上查询 Circle 中的 __dict__ ,然后查找到名为 area 的属性,同时这是一个 non data descriptors ,由于我们的实例字典内并不存在 area 属性,那么我们便调用类字典中的 area 的 __get__ 方法,并在 __get__ 方法中通过调用 setattr 方法为实例字典注册属性 area 。紧接着,我们在后续调用 c.area 的时候,我们能在实例字典中找到 area 属性的存在,且类字典中的 area 是一个 non data descriptors ,于是我们不会触发代码里所实现的 __get__ 方法,而是直接从实例的字典中直接获取属性值。 描述符的使用 描述符的使用面很广,不过其主要的目的在于让我们的调用过程变得可控。因此我们在一些需要对我们调用过程实行精细控制的时候,使用描述符,比如我们之前提到的这个例子classlazyproperty: def__init__(self, func): self.func = func def__get__(self, instance, owner): ifinstanceisNone: returnself else: value = self.func(instance) setattr(instance, self.func.__name__, value) returnvalue def__set__(self, instance, value=0): pass importmath classCircle: def__init__(self, radius): self.radius = radius pass @lazyproperty defarea(self, value=0): print("Com") ifvalue ==0andself.radius ==0: raiseTypeError("Something went wring") returnmath.pi value 2ifvalue !=0elsemath.pi self.radius 2 deftest(self): pass 利用描述符的特性实现懒加载,再比如,我们可以控制属性赋值的值classProperty(object): "Emulate PyProperty_Type() in Objects/descrobject.c" def__init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel ifdocisNoneandfgetisnotNone: doc = fget.__doc__ self.__doc__ = doc def__get__(self, obj, objtype=None): ifobjisNone: returnself ifself.fgetisNone: raiseAttributeError("unreadable attribute") returnself.fget(obj) def__set__(self, obj, value=None): ifvalueisNone: raiseTypeError("You cant to set value as None") ifself.fsetisNone: raiseAttributeError("can't set attribute") self.fset(obj, value) def__delete__(self, obj): ifself.fdelisNone: raiseAttributeError("can't delete attribute") self.fdel(obj) defgetter(self, fget): returntype(self)(fget, self.fset, self.fdel, self.__doc__) defsetter(self, fset): returntype(self)(self.fget, fset, self.fdel, self.__doc__) defdeleter(self, fdel): returntype(self)(self.fget, self.fset, fdel, self.__doc__) classtest(): def__init__(self, value): self.value = value @Property defValue(self): returnself.value @Value.setter deftest(self, x): self.value = x 如上面的例子所描述的一样,我们可以判断所传入的值是否有效等等。 以上就是Python 描述符(Descriptor)入门,更多相关文章请关注PHP中文网(www.gxlcms.com)! 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:php中文网 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39736934/article/details/112888600。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-05-07 19:03:49
94
转载
转载文章
...gios也在不断迭代升级以适应新的运维场景。 例如,Nagios XI作为Nagios系列的旗舰产品,不仅继承了原有的强大监控功能,更提供了直观易用的Web界面和实时仪表板,方便用户快速定位问题并作出响应。此外,它支持大规模分布式环境下的监控,并能够无缝集成各类第三方工具和服务,如Prometheus、Grafana等,实现全方位的监控解决方案。 与此同时,开源社区对Nagios的贡献也日益丰富,涌现出了像Icinga、Naemon等基于Nagios核心的衍生项目,它们在保持兼容性的同时,引入更多现代化特性,比如灵活的插件体系、API驱动的自动化运维能力等,进一步提升了监控系统的灵活性和可扩展性。 而在最新的行业实践案例中,许多大型企业已成功运用Nagios搭建起高效稳定的监控平台,通过精细化的配置管理,有效预防潜在故障,确保业务连续性和稳定性。因此,对于任何想要提升IT基础设施监控管理水平的组织来说,深入研究Nagios的配置技巧并跟进其最新发展动态,无疑是一项极具价值的工作。
2023-11-16 20:48:42
483
转载
转载文章
...科技创新如何驱动产业升级,并吸引大量关注前沿科技动态的求职者加入。 此外,随着国家对共享经济、金融科技以及智慧物流等新兴产业的支持与规范,相关企业在招聘中也表现出强劲的需求。例如,水滴公司、狮桥等企业的招聘信息显示,它们正积极布局新赛道,急需各类技术人才尤其是JAVA开发人员,共同推动行业创新与发展。 总之,在瞬息万变的互联网领域,望京地区的这些公司以其独特的企业文化和行业地位,为广大求职者描绘了一幅充满机遇与挑战的职业画卷。对于有志于投身互联网行业的应聘者来说,深入了解各个公司的业务特色、企业文化以及发展趋势,将有助于他们找准定位,把握住金秋招聘季的宝贵机遇,开启职业生涯的新篇章。
2023-01-11 22:59:19
529
转载
Tornado
...Tornado 是 Python 中的一个高性能 Web 框架,它轻量级又灵活,适合构建实时应用或者需要高并发处理的应用场景。我以前用 Django 做过几个项目,感觉还挺不错的。不过一到几十万人同时在线的时候,服务器就开始“吭哧吭哧”地忙不过来了,感觉它都快撑不住了,哎哟,真是让人头大!后来听人说 Tornado 的异步非阻塞功能特别厉害,我心想不能落后啊,赶紧抽空研究了一下。结果发现,它的性能确实吊炸天,而且代码写起来也挺优雅。 然后是 Google Cloud Secret Manager,这是一个专门用来存储敏感信息(比如 API 密钥、数据库密码啥的)的服务。对开发者而言,安全这事得放首位,要是还用那种硬编码或者直接把密钥啥的写进配置文件的老办法,那简直就是在玩火自焚啊!Google Cloud Secret Manager 提供了加密存储、访问控制等功能,简直是保护秘钥的最佳选择之一。 所以,当我把这两者放在一起的时候,脑海里立刻浮现出一个画面:Tornado 快速响应前端请求,而 Secret Manager 在背后默默守护着那些珍贵的秘密。是不是很带感?接下来我们就一步步深入探索它们的合作方式吧! --- 2. 初识Tornado 搭建一个简单的Web服务 既然要玩转 Tornado,咱们得先搭个基础框架才行。好嘞,接下来我就简单搞个小网页服务,就让它回一句暖心的问候就行啦!虽然看起来简单,但这可是后续一切的基础哦! python import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, Tornado!") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) print("Server started at http://localhost:8888") tornado.ioloop.IOLoop.current().start() 这段代码超级简单对不对?我们定义了一个 MainHandler 类继承自 tornado.web.RequestHandler,重写了它的 get 方法,当收到 GET 请求时就会执行这个方法,并向客户端返回 "Hello, Tornado!"。然后呢,就用 make_app 这个函数把路由和这个处理器绑在一起,最后再启动服务器,让它开始监听 8888 端口。 运行后打开浏览器输入 http://localhost:8888,就能看到页面显示 "Hello, Tornado!" 了。是不是特别爽?不过别急着高兴,这只是万里长征的第一步呢! --- 3. 引入Google Cloud Secret Manager:让秘密不再裸奔 现在我们知道如何用 Tornado 做点事情了,但问题是,如果我们的应用程序需要用到一些敏感信息(例如数据库连接字符串),该怎么办呢?直接写在代码里吗?当然不行!这就是为什么我们要引入 Google Cloud Secret Manager。 3.1 安装依赖库 首先需要安装 Google Cloud 的官方 Python SDK: bash pip install google-cloud-secret-manager 3.2 获取Secret Manager中的值 假设我们在 Google Cloud Console 上已经创建了一个名为 my-secret 的密钥,并且它里面保存了我们的数据库密码。我们可以这样从 Secret Manager 中读取这个值: python from google.cloud import secretmanager def access_secret_version(project_id, secret_id, version_id): client = secretmanager.SecretManagerServiceClient() name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" response = client.access_secret_version(name=name) payload = response.payload.data.decode('UTF-8') return payload 使用示例 db_password = access_secret_version("your-project-id", "my-secret", "latest") print(f"Database Password: {db_password}") 这段代码做了什么呢?很简单,它实例化了一个 SecretManagerServiceClient 对象,然后根据提供的项目 ID、密钥名称以及版本号去访问对应的密钥内容。注意这里的 version_id 参数可以设置为 "latest" 来获取最新的版本。 --- 4. 将两者结合起来 构建更安全的应用 那么问题来了,怎么才能让 Tornado 和 Google Cloud Secret Manager 协同工作呢?其实答案很简单——我们可以将从 Secret Manager 获取到的敏感数据注入到 Tornado 的配置对象中,从而在整个应用范围内使用这些信息。 4.1 修改Tornado应用以支持从Secret Manager加载配置 让我们修改之前的 MainHandler 类,让它从 Secret Manager 中加载数据库密码并用于某种操作(比如查询数据库)。为了简化演示,这里我们假设有一个 get_db_password 函数负责完成这项任务: python from google.cloud import secretmanager def get_db_password(): client = secretmanager.SecretManagerServiceClient() name = f"projects/{YOUR_PROJECT_ID}/secrets/my-secret/versions/latest" response = client.access_secret_version(name=name) return response.payload.data.decode('UTF-8') class MainHandler(tornado.web.RequestHandler): def initialize(self, db_password): self.db_password = db_password def get(self): self.write(f"Connected to database with password: {self.db_password}") def make_app(): db_password = get_db_password() return tornado.web.Application([ (r"/", MainHandler, {"db_password": db_password}), ]) 在这个例子中,我们在 make_app 函数中调用了 get_db_password() 来获取数据库密码,并将其传递给 MainHandler 的构造函数作为参数。这样一来,每个 MainHandler 实例都会拥有自己的数据库密码属性。 --- 5. 总结与展望 好了朋友们,今天的分享就到这里啦!通过这篇文章,我们了解了如何利用 Tornado 和 Google Cloud Secret Manager 来构建更加安全可靠的 Web 应用。虽然过程中遇到了不少挑战,但最终的效果还是让我感到非常满意。 未来的话,我还想尝试更多有趣的功能组合,比如结合 Redis 缓存提高性能,或者利用 Pub/Sub 实现消息队列机制。如果你也有类似的想法或者遇到什么问题,欢迎随时跟我交流呀! 最后祝大家 coding愉快,记得保护好自己的秘密哦~ 😊
2025-04-09 15:38:23
43
追梦人
转载文章
...编程入门到精通的绝佳教程资源。 综上所述,无论是从MPI技术的最新进展、云计算环境下的并行计算解决方案,还是深入学习MPI编程的专业书籍推荐,都为那些想要在并行计算领域持续探索和实践的读者提供了丰富的延伸阅读内容。
2023-04-09 11:52:38
113
转载
.net
...ctice”的互动式教程,旨在帮助开发者更好地理解并掌握依赖注入的实际应用。这款教程结合了理论讲解与动手实践,让用户可以在真实的开发环境中体验如何正确配置DI容器。例如,用户可以通过模拟不同生命周期的场景来观察Singleton、Transient和Scoped三种模式的具体表现,还可以尝试修复一些常见的配置错误,如服务注册遗漏或生命周期设置不当等问题。 此外,微软近期更新了其官方文档,新增了关于ASP.NET Core中DI容器高级特性的章节。这部分内容详细介绍了如何自定义DI容器的行为,包括拦截器机制、动态代理生成以及跨模块的依赖解析策略。这对于构建大型分布式系统尤其有用,因为它允许开发者在不影响现有业务逻辑的前提下,实现更复杂的依赖关系管理。 值得注意的是,谷歌也在其开源项目中大力推广依赖注入的理念。例如,Flutter团队推出了一套名为GetIt的新一代DI库,它不仅支持多种平台(Web、Mobile、Desktop),还提供了更为简洁的API设计。相比传统的Dagger或Hilt,GetIt更适合小型项目或快速原型开发,其轻量化的特点使得开发者能够迅速上手并提升生产力。 与此同时,国内的一些技术社区也开始关注这一领域的发展趋势。例如,InfoQ最近发表了一篇深度解读文章,分析了国内企业在采用DI模式时面临的挑战,特别是如何平衡灵活性与稳定性之间的关系。文章指出,尽管DI能够显著改善代码结构,但在实际落地过程中仍需谨慎权衡,尤其是在高并发场景下,不恰当的配置可能导致资源浪费甚至系统崩溃。 综上所述,无论是国际巨头还是本土企业,都在积极拥抱依赖注入技术,并探索适合自身需求的最佳实践。对于开发者而言,持续关注行业动态和技术演进,及时调整学习方向,无疑是保持竞争力的关键所在。
2025-05-07 15:53:50
41
夜色朦胧
转载文章
...通过官方文档快速掌握升级方法并充分利用新版本优势(参考来源:Node.js官方网站)。同时,MySQL数据库也在不断迭代更新,MySQL 8.0带来了诸如窗口函数、Caching_sha2_password等安全性和功能性的重大改进,对于提升项目的数据处理效率和安全性具有重要意义(参考来源:MySQL官网博客)。 在云服务和镜像源方面,阿里云、腾讯云等国内服务商也推出了针对deepin系统的加速镜像源服务,用户可根据自身网络状况选择合适的镜像源以提高软件安装和更新的速度(参考来源:阿里云、腾讯云官方文档)。此外,随着Web开发技术的发展,Vue.js、React等前端框架持续火爆,配合Webpack、Vite等现代构建工具,可以更高效地搭建和维护前端项目结构(参考来源:Vue.js、React官网及技术社区文章)。 在办公领域,WPS Office不仅实现了对Linux系统的全面支持,还不断优化跨平台兼容性,并且积极跟进Microsoft Office的新功能,使得国产办公软件在用户体验上逐渐与国际接轨(参考来源:WPS官方公告及媒体报道)。而在浏览器市场,除了Edge浏览器之外,Firefox、Chromium-based浏览器如Chrome和Opera同样提供Linux版,它们之间的性能对比、隐私保护策略以及对Web新技术的支持情况值得深入研究(参考来源:各大浏览器官网及第三方评测报告)。 总之,随着开源生态的繁荣和Linux发行版的普及,关注和掌握deepin系统及其周边软件的最新发展动态,将有助于我们更好地利用这一平台进行高效开发和舒适办公。
2023-11-15 19:14:44
54
转载
Hive
...,我赶紧联系运维团队升级了相关依赖,这才顺利解决问题。 还有一个教训是关于文件命名规范的。一开始啊,我老是忘了在压缩完的文件后面加“.gz”或者“.bz2”这种后缀名,搞得 Hive 一脸懵逼,根本分不清文件是啥类型的,直接就报错不认账了。后来我才明白,那些后缀名可不只是个摆设啊,它们其实是给文件贴标签的,告诉你这个文件是啥玩意儿,是图片、音乐,还是什么乱七八糟的东西。 --- 五、总结与展望 总的来说,虽然Hive对GZIP和BZIP2的支持有限,但这并不意味着我们不能利用它们的优势。相反,只要掌握了正确的技巧,我们完全可以在这两者之间找到平衡点,满足不同的业务需求。 最后,我想说的是,作为一名数据工程师,我们不应该被工具的限制束缚住手脚。相反,我们应该敢于尝试新事物,勇于突破常规。毕竟,正是这种探索精神,推动着整个行业不断向前发展! 好了,今天的分享就到这里啦。如果你也有类似的经历或者想法,欢迎随时跟我交流哦~再见啦!
2025-04-19 16:20:43
45
翡翠梦境
转载文章
...原因 9 清理 这篇教程指导如何给容器分配申请的内存和内存限制。我们保证让容器获得足够的内存 资源,但是不允许它使用超过限制的资源。 Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube. 你的集群里每个节点至少必须拥有300M的内存。 这个教程里有几个步骤要求Heapster , 但是如果你没有Heapster的话,也可以完成大部分的实验,就算跳过这些Heapster 步骤,也不会有什么问题。 检查看Heapster服务是否运行,执行命令: kubectl get services --namespace=kube-system 如果Heapster服务正在运行,会有如下输出: NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkube-system heapster 10.11.240.9 <none> 80/TCP 6d 创建一个命名空间 创建命名空间,以便你在实验中创建的资源可以从集群的资源中隔离出来。 kubectl create namespace mem-example 配置内存申请和限制 给容器配置内存申请,只要在容器的配置文件里添加resources:requests就可以了。配置限制的话, 则是添加resources:limits。 本实验,我们创建包含一个容器的Pod,这个容器申请100M的内存,并且内存限制设置为200M,下面 是配置文件: memory-request-limit.yaml apiVersion: v1kind: Podmetadata:name: memory-demospec:containers:- name: memory-demo-ctrimage: vish/stressresources:limits:memory: "200Mi"requests:memory: "100Mi"args:- -mem-total- 150Mi- -mem-alloc-size- 10Mi- -mem-alloc-sleep- 1s 在这个配置文件里,args代码段提供了容器所需的参数。-mem-total 150Mi告诉容器尝试申请150M 的内存。 创建Pod: kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/memory-request-limit.yaml --namespace=mem-example 验证Pod的容器是否正常运行: kubectl get pod memory-demo --namespace=mem-example 查看Pod的详细信息: kubectl get pod memory-demo --output=yaml --namespace=mem-example 这个输出显示了Pod里的容器申请了100M的内存和200M的内存限制。 ...resources:limits:memory: 200Mirequests:memory: 100Mi... 启动proxy以便我们可以访问Heapster服务: kubectl proxy 在另外一个命令行窗口,从Heapster服务获取内存使用情况: curl http://localhost:8001/api/v1/proxy/namespaces/kube-system/services/heapster/api/v1/model/namespaces/mem-example/pods/memory-demo/metrics/memory/usage 这个输出显示了Pod正在使用162,900,000字节的内存,大概就是150M。这很明显超过了申请 的100M,但是还没达到200M的限制。 {"timestamp": "2017-06-20T18:54:00Z","value": 162856960} 删除Pod: kubectl delete pod memory-demo --namespace=mem-example 超出容器的内存限制 只要节点有足够的内存资源,那容器就可以使用超过其申请的内存,但是不允许容器使用超过其限制的 资源。如果容器分配了超过限制的内存,这个容器将会被优先结束。如果容器持续使用超过限制的内存, 这个容器就会被终结。如果一个结束的容器允许重启,kubelet就会重启他,但是会出现其他类型的运行错误。 本实验,我们创建一个Pod尝试分配超过其限制的内存,下面的这个Pod的配置文档,它申请50M的内存, 内存限制设置为100M。 memory-request-limit-2.yaml apiVersion: v1kind: Podmetadata:name: memory-demo-2spec:containers:- name: memory-demo-2-ctrimage: vish/stressresources:requests:memory: 50Milimits:memory: "100Mi"args:- -mem-total- 250Mi- -mem-alloc-size- 10Mi- -mem-alloc-sleep- 1s 在配置文件里的args段里,可以看到容器尝试分配250M的内存,超过了限制的100M。 创建Pod: kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/memory-request-limit-2.yaml --namespace=mem-example 查看Pod的详细信息: kubectl get pod memory-demo-2 --namespace=mem-example 这时候,容器可能会运行,也可能会被杀掉。如果容器还没被杀掉,重复之前的命令直至 你看到这个容器被杀掉: NAME READY STATUS RESTARTS AGEmemory-demo-2 0/1 OOMKilled 1 24s 查看容器更详细的信息: kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example 这个输出显示了容器被杀掉因为超出了内存限制。 lastState:terminated:containerID: docker://65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10fexitCode: 137finishedAt: 2017-06-20T20:52:19Zreason: OOMKilledstartedAt: null 本实验里的容器可以自动重启,因此kubelet会再去启动它。输入多几次这个命令看看它是怎么 被杀掉又被启动的: kubectl get pod memory-demo-2 --namespace=mem-example 这个输出显示了容器被杀掉,被启动,又被杀掉,又被启动的过程: stevepe@sperry-1:~/steveperry-53.github.io$ kubectl get pod memory-demo-2 --namespace=mem-exampleNAME READY STATUS RESTARTS AGEmemory-demo-2 0/1 OOMKilled 1 37sstevepe@sperry-1:~/steveperry-53.github.io$ kubectl get pod memory-demo-2 --namespace=mem-exampleNAME READY STATUS RESTARTS AGEmemory-demo-2 1/1 Running 2 40s 查看Pod的历史详细信息: kubectl describe pod memory-demo-2 --namespace=mem-example 这个输出显示了Pod一直重复着被杀掉又被启动的过程: ... Normal Created Created container with id 66a3a20aa7980e61be4922780bf9d24d1a1d8b7395c09861225b0eba1b1f8511... Warning BackOff Back-off restarting failed container 查看集群里节点的详细信息: kubectl describe nodes 输出里面记录了容器被杀掉是因为一个超出内存的状况出现: Warning OOMKilling Memory cgroup out of memory: Kill process 4481 (stress) score 1994 or sacrifice child 删除Pod: kubectl delete pod memory-demo-2 --namespace=mem-example 配置超出节点能力范围的内存申请 内存的申请和限制是针对容器本身的,但是认为Pod也有容器的申请和限制是一个很有帮助的想法。 Pod申请的内存就是Pod里容器申请的内存总和,类似的,Pod的内存限制就是Pod里所有容器的 内存限制的总和。 Pod的调度策略是基于请求的,只有当节点满足Pod的内存申请时,才会将Pod调度到合适的节点上。 在这个实验里,我们创建一个申请超大内存的Pod,超过了集群里任何一个节点的可用内存资源。 这个容器申请了1000G的内存,这个应该会超过你集群里能提供的数量。 memory-request-limit-3.yaml apiVersion: v1kind: Podmetadata:name: memory-demo-3spec:containers:- name: memory-demo-3-ctrimage: vish/stressresources:limits:memory: "1000Gi"requests:memory: "1000Gi"args:- -mem-total- 150Mi- -mem-alloc-size- 10Mi- -mem-alloc-sleep- 1s 创建Pod: kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/memory-request-limit-3.yaml --namespace=mem-example 查看Pod的状态: kubectl get pod memory-demo-3 --namespace=mem-example 输出显示Pod的状态是Pending,因为Pod不会被调度到任何节点,所有它会一直保持在Pending状态下。 kubectl get pod memory-demo-3 --namespace=mem-exampleNAME READY STATUS RESTARTS AGEmemory-demo-3 0/1 Pending 0 25s 查看Pod的详细信息包括事件记录 kubectl describe pod memory-demo-3 --namespace=mem-example 这个输出显示容器不会被调度因为节点上没有足够的内存: Events:... Reason Message------ -------... FailedScheduling No nodes are available that match all of the following predicates:: Insufficient memory (3). 内存单位 内存资源是以字节为单位的,可以表示为纯整数或者固定的十进制数字,后缀可以是E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki.比如,下面几种写法表示相同的数值:alue: 128974848, 129e6, 129M , 123Mi 删除Pod: kubectl delete pod memory-demo-3 --namespace=mem-example 如果不配置内存限制 如果不给容器配置内存限制,那下面的任意一种情况可能会出现: 容器使用内存资源没有上限,容器可以使用当前节点上所有可用的内存资源。 容器所运行的命名空间有默认内存限制,容器会自动继承默认的限制。集群管理员可以使用这个文档 LimitRange来配置默认的内存限制。 内存申请和限制的原因 通过配置容器的内存申请和限制,你可以更加有效充分的使用集群里内存资源。配置较少的内存申请, 可以让Pod跟任意被调度。设置超过内存申请的限制,可以达到以下效果: Pod可以在负载高峰时更加充分利用内存。 可以将Pod的内存使用限制在比较合理的范围。 清理 删除命名空间,这会顺便删除命名空间里的Pod。 kubectl delete namespace mem-example 译者:NickSu86 原文链接 本篇文章为转载内容。原文链接:https://blog.csdn.net/Aria_Miazzy/article/details/99694937。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-23 12:14:07
495
转载
Beego
...名电商企业在一次系统升级过程中,由于配置文件格式错误导致服务中断长达数小时。事后调查发现,问题的根本原因并非技术难度,而是团队缺乏对配置管理的重视。这一事件引发了行业内对于配置文件规范化管理的反思。一些专家指出,现代开发团队应当建立完善的 CI/CD 流程,将配置文件的检查纳入自动化测试环节,从而最大限度地减少人为失误。 此外,近年来 DevOps 思维的兴起也为配置管理带来了新的视角。传统的配置管理往往被视为运维人员的职责,但在 DevOps 文化中,开发与运维之间的界限逐渐模糊。这意味着开发者也需要具备一定的配置管理知识,以便更好地支持持续交付流程。例如,GitHub Actions 等工具集成了丰富的配置模板,帮助开发者快速搭建自动化工作流。这种趋势不仅提升了效率,还促进了跨部门协作。 回到 Beego 框架本身,其核心开发者也在积极迭代版本,引入更多智能化特性。例如,新版 Beego 支持基于环境变量的动态配置加载,允许用户在不同环境中灵活切换设置。这一改进既体现了技术的进步,也反映了社区对用户体验的关注。未来,随着 Go 语言生态的不断完善,配置管理工具可能会进一步集成到语言标准库中,形成更加统一的解决方案。 综上所述,无论是从技术趋势还是实际应用的角度看,配置文件管理始终是软件工程中的重要一环。希望本文能够激发读者对这一领域的兴趣,并鼓励大家在日常工作中投入更多精力去优化配置流程。毕竟,正如一句古话所言:“千里之堤,溃于蚁穴”,细微之处往往决定成败。
2025-04-13 15:33:12
24
桃李春风一杯酒
转载文章
...tml5,html5教程 html5,html5教程 1.向后兼容 HTML5是这样被定义的:能向后兼容目前UA处理内容的方式.为了让语言更简单,一些老的元素和Attribute被舍弃.比如一些纯粹用于展现的元素(译注:即非语 ... 一步HTML5教程学会体系 HTML5是HTML最新的版本,万维网联盟. HTML5是下一代的HTML标准,HTML5是为了在移动设备上支持多媒体. 新特性: 绘画的canvas元素,用于媒介回放的video和audio元素,对 ... IT兄弟连 HTML5教程 了解HTML5的主流应用1 在很多人眼里,HTML5与互联网营销密切相关,但其实从开发者的角度而言,它是一种网页标准,定义了浏览器语言的编写规范.伴随HTML5标准尘埃落定,浏览器对HTML5特性的逐步支持,再加上国内对HTML ... 【转帖】39个让你受益的HTML5教程 39个让你受益的HTML5教程 闲话少说,本文作者为大家收集了网上学习HTML5的资源,期望它们可以帮助大家更好地学习HTML5. 好人啊! 不过,作者原来说的4 ... 【特别推荐】Web 开发人员必备的经典 HTML5 教程 对于我来说,Web 前端开发是最酷的职业之一,因为你可以用新的技术发挥,创造出一些惊人的东西.唯一的问题是,你需要跟上这个领域的发展脚步,因此,你必须不断的学习,不断的前进.本文将分享能够帮助您快速掌 ... HTML5教程之本地存储SessionStorage SessionStorage: 将数据保存在session对象中,所谓session是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间会话,也就是用户浏览这个网站所花费的时间就是sess ... 随机推荐 【转】MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ... IIS7 / IIS7.5 URL 重写 HTTP 重定向到 HTTPS(转) 转自: http://www.cnblogs.com/yipu/p/3880518.html 1.购买SSL证书,参考:http://www.cnblogs.com/yipu/p/3722135. ... OpenGL的glViewPort窗口设置函数实现分屏 之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPort函数,废话不多说了,我直接上代码: //从这里开始进 ... hdu 4764 Stone (巴什博弈,披着狼皮的羊,小样,以为换了身皮就不认识啦) 今天(2013/9/28)长春站,最后一场网络赛! 3~5分钟后有队伍率先发现伪装了的签到题(博弈) 思路: 与取石头的巴什博弈对比 题目要求第一个人取数字在[1,k]间的某数x,后手取x加[1,k] ... android报表图形引擎(AChartEngine)demo解析与源码 AchartEngine支持多种图表样式,本文介绍两种:线状表和柱状表. AchartEngine有两种启动的方式:一种是通过ChartFactory.getView()方式来直接获取到view ... CSS长度单位及区别 em ex px pt in 1. css相对长度单位 Ø em 元素的字体高度 Ø ex 字体x的高度 Ø px ... es6的箭头函数 1.使用语法 : 参数 => 函数语句; 分为以下几种形式 : (1) ()=>语句 ( )=> statement 这是一种简写方法省略了花括号和return 相当于 ()=&g ... pdfplumber库解析pdf格式 参考地址:https://github.com/jsvine/pdfplumber 简单的pdf转换文本: import pdfplumber with pdfplumber.open(path) a ... KMP替代算法——字符串Hash 很久以前写的... 今天来谈谈一种用来替代KMP算法的奇葩算法--字符串Hash 例题:给你两个字符串p和s,求出p在s中出现的次数.(字符串长度小于等于1000000) 字符串的Hash 根据字面意 ... SSM_CRUD新手练习(5)测试mapper 上一篇我们使用逆向工程生成了所需要的bean.dao和对应的mapper.xml文件,并且修改好了我们需要的数据库查询方法. 现在我们来测试一下DAO层,在test包下新建一个MapperTest.j ... 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_35666639/article/details/118169985。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-07-16 11:42:34
252
转载
Hadoop
...理员,询问是否有可能升级现有的网络基础设施,比如更换更快的交换机或者部署新的光纤线路。 2. 调整副本策略 默认情况下,HDFS会将每个文件的三个副本均匀分布在整个集群中。然而,在某些特殊场景下,这种做法并不一定是最优解。比如说,你家APP平时就爱扎堆在那几个服务器节点上干活儿,那就可以把副本都放一块儿,这样它们串门聊天、传文件啥的就方便多了,也不用跑太远浪费时间啦! 配置修改: xml dfs.block.local-path-access.enabled true 3. 使用缓存机制 缓存就像冰箱里的剩饭,拿出来就能直接吃,不用重新加热。HDFS也有类似的机制,叫做“DataNode Cache”。打开这个功能之后啊,那些经常用到的数据就会被暂时存到内存里,这样下次再用的时候就嗖的一下快多了! 启用步骤: bash hadoop dfsadmin -setSpaceQuota 100g /cachedir hadoop dfs -cache /inputfile /cachedir 四、总结与展望 通过今天的讨论,我相信大家都对HDFS读取速度慢的原因有了更深的理解。其实,无论是网络延迟、数据本地性还是磁盘I/O瓶颈,都不是不可克服的障碍。其实吧,只要咱们肯花点心思去琢磨、去试试,肯定能找出个适合自己情况的办法。 最后,我想说的是,作为一名技术人员,我们应该始终保持好奇心和探索精神。不要害怕失败,也不要急于求成,因为每一次挫折都是一次成长的机会。希望这篇文章能给大家带来启发,让我们一起努力,让Hadoop变得更加高效可靠吧! --- 以上就是我对“HDFS读取速度慢”的全部看法和建议。如果你还有其他想法或者遇到类似的问题,请随时留言交流。咱们共同进步,一起探索大数据世界的奥秘!
2025-05-04 16:24:39
103
月影清风
Netty
...算系统近期完成了全面升级,采用了基于Netty的微服务架构,实现了每秒百万级的交易处理能力,同时大幅降低了系统延迟和资源消耗。这一成功案例不仅验证了Netty在高并发场景下的强大适应性,也为其他金融机构提供了宝贵的经验。 此外,在物联网领域,Netty的应用同样值得关注。随着智能家居设备数量的激增,如何高效处理海量设备的实时通信成为一大挑战。Netty凭借其轻量级、非阻塞的特性,成为了许多物联网平台的首选解决方案。例如,一家领先的智能家居公司通过引入Netty,成功构建了全球化的设备管理平台,支持数千万台设备的同时在线。该平台不仅实现了设备间的数据同步,还通过心跳检测和长连接复用等技术,确保了通信的稳定性和可靠性。 从技术发展的角度来看,Netty的未来潜力依然巨大。随着Rust等新兴编程语言逐渐进入主流视野,未来的Netty版本可能会结合多语言特性,进一步提升系统的兼容性和性能。同时,随着量子计算技术的发展,Netty的研究者们也在积极探索如何将这一前沿技术融入框架中,以应对未来更大规模的分布式计算需求。这些趋势表明,Netty不仅在当下具有重要意义,还将继续引领未来的网络编程潮流。
2025-03-19 16:22:40
79
红尘漫步
转载文章
...过学习官方文档或社区教程,用户可以深入了解如何利用Docker构建并推送镜像至私有仓库,再由Kubernetes调度器拉取这些镜像以部署复杂的应用服务网格。 综上所述,掌握Docker不仅是了解基础容器技术的关键,而且还需要关注其最新发展动态和技术生态演进,例如新版本特性、安全增强措施以及与Kubernetes等生态系统组件的深度融合。对于希望进一步提升DevOps能力的专业人士来说,持续跟进Docker相关领域的前沿研究与实践案例,无疑能为自身技术栈的丰富与完善提供强大支撑。
2023-11-26 15:47:20
538
转载
ZooKeeper
...,那么可能就需要考虑升级服务器硬件了。比如增加内存、提升CPU性能,甚至更换更快的磁盘。当然,这通常是最后的选择,因为它涉及到成本和技术难度。 4. 使用异步API ZooKeeper提供了同步和异步两种API,其中异步API可以在一定程度上缓解CommitQueueFullException的问题。异步API可酷了!你提交个请求,它立马给你返回结果,根本不用傻等那个响应回来。这样一来啊,就相当于给任务队列放了个假,压力小了很多呢! 代码示例: java import org.apache.zookeeper.AsyncCallback.StringCallback; public class AsyncExample implements StringCallback { @Override public void processResult(int rc, String path, Object ctx, String name) { if (rc == 0) { System.out.println("Node created successfully at path: " + name); } else { System.err.println("Failed to create node with error code: " + rc); } } public static void main(String[] args) throws Exception { ZooKeeper zk = new ZooKeeper("localhost:2181", 5000, null); zk.createAsync("/asyncTest", "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncExample(), null); } } 在这段代码中,我们使用了createAsync()方法来异步创建节点。相比于同步版本,这种方式不会阻塞主线程,从而降低了队列满的风险。 --- 四、总结与展望 通过今天的探讨,我相信大家都对CommitQueueFullException有了更深刻的理解。嘿,别被这个错误吓到!其实啊,它也没那么可怕。只要你找到对的方法,保证分分钟搞定,就跟玩儿似的! 回顾整个过程,我觉得最重要的是要保持冷静和耐心。遇到技术难题的时候啊,别慌!先搞清楚它到底是个啥问题,就像剥洋葱一样,一层层搞明白本质。接着呢,就一步一步地去找解决的办法,慢慢来,总能找到出路的!就像攀登一座高山一样,每一步都需要脚踏实地。 最后,我想鼓励大家多动手实践。理论固然重要,但真正的成长来自于不断的尝试和失败。希望大家能够在实际项目中运用今天学到的知识,创造出更加优秀的应用! 好了,今天的分享就到这里啦!如果你还有什么疑问或者想法,欢迎随时交流哦~
2025-03-16 15:37:44
10
林中小径
Redis
...分布式锁实现 python import redis import time def acquire_lock(redis_client, lock_key, timeout=10): 尝试加锁,设置过期时间为timeout秒 result = redis_client.set(lock_key, "locked", nx=True, ex=timeout) return bool(result) def release_lock(redis_client, lock_key): 使用Lua脚本来保证解锁的安全性 script = """ if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end """ redis_client.eval(script, keys=[lock_key], args=["locked"]) 这段代码展示了最基础的分布式锁实现方式。我们用set命令设置了两个参数:一个是NX,意思是“只在key不存在的时候才创建”,这样就能避免重复创建;另一个是EX,给这个锁加了个过期时间,相当于设了个倒计时,万一客户端挂了或者出问题了,锁也能自动释放,就不会一直卡在那里变成死锁啦。最后,解锁的时候我们用了Lua脚本,这样可以保证操作的原子性。 --- 4. 如何解决锁的隔离性问题? 诶,说到这里,问题来了——如果两个不同的业务逻辑都需要用到同一个锁怎么办?比如订单系统和积分系统都想操作同一个用户的数据,这时候就需要考虑锁的隔离性了。换句话说,我们需要确保不同业务逻辑之间的锁不会互相干扰。 示例代码 2:基于命名空间的隔离策略 python def acquire_namespace_lock(redis_client, namespace, lock_name, timeout=10): 构造带命名空间的锁名称 lock_key = f"{namespace}:{lock_name}" result = redis_client.set(lock_key, "locked", nx=True, ex=timeout) return bool(result) def release_namespace_lock(redis_client, namespace, lock_name): lock_key = f"{namespace}:{lock_name}" script = """ if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end """ redis_client.eval(script, keys=[lock_key], args=["locked"]) 在这个版本中,我们在锁的名字前面加上了命名空间前缀,比如orders:place_order和points:update_score。这样一来,不同业务逻辑就可以使用独立的锁,避免相互影响。 --- 5. 进阶 如何处理锁竞争与性能优化? 当然啦,现实中的分布式锁并不会总是那么顺利,有时候会出现大量请求同时争抢同一个锁的情况。这时我们可能需要引入队列机制或者批量处理的方式来降低系统的压力。 示例代码 3:使用Redis的List模拟队列 python def enqueue_request(redis_client, queue_key, request_data): redis_client.rpush(queue_key, request_data) def dequeue_request(redis_client, queue_key): return redis_client.lpop(queue_key) def process_queue(redis_client, lock_key, queue_key): while True: 先尝试获取锁 if not acquire_lock(redis_client, lock_key): time.sleep(0.1) 等待一段时间再重试 continue 获取队列中的第一个请求并处理 request = dequeue_request(redis_client, queue_key) if request: handle_request(request) 释放锁 release_lock(redis_client, lock_key) 这段代码展示了如何利用Redis的List结构来管理请求队列。想象一下,好多用户一起抢同一个东西,场面肯定乱哄哄的对吧?这时候,咱们就让他们老老实实排成一队,然后派一个专门的小哥挨个儿去处理他们的请求。这样一来,大家就不会互相“打架”了,事情也能更顺利地办妥。 --- 6. 总结与反思 兄弟们,通过今天的讨论,我相信大家都对如何在Redis中实现分布式锁有了更深刻的理解了吧?虽然Redis本身已经足够强大,但我们仍然需要根据实际需求对其进行适当的扩展和优化。比如刚才提到的命名空间隔离、队列机制等,这些都是非常实用的小技巧。 不过呢,我也希望大家能记住一点——技术永远不是一成不变的。业务越做越大,技术也日新月异的,咱们得不停地充电,学点新鲜玩意儿,试试新招数才行啊!就像今天的分布式锁一样,也许明天就会有更高效、更优雅的解决方案出现。所以,保持好奇心,勇于探索未知领域,这才是程序员最大的乐趣所在! 好了,今天就聊到这里啦,祝大家在编程的路上越走越远!如果有任何疑问或者想法,欢迎随时找我交流哦~
2025-04-22 16:00:29
58
寂静森林
转载文章
... 成视频文件输出; Python实现 不要开启线程池,因为会有一些问题 app.py config 中可以配置 import requestsimport reimport jsonimport timeimport pymongoimport psutilfrom hashlib import md5from moviepy.editor import from multiprocessing import Pool基本配置config = {'UID':'gKpdxKRWXwaW',用户ID'CID':104,栏目ID'TYPE':1, 1=>按用户id采集列表,2=>按栏目ID采集列表'TIME_START':1,起始时间'TIME_ENT':500,结束时间'PAGE_START':1,起始页'PAGE_END':10,结束页'TIME_GE':0,每个下载间隔时间'POOL':False,是否开启线程池'CHECKID':True, True 过滤已经下载过的视频 False 不过滤'FILE_PATH':'F:/ceshi/',下载目录,【会自动创建文件夹】'TS_PATH':'F:/ceshi/download/',缓存文件目录,【会自动创建文件夹】'DB_URL':'localhost',数据库地址'DB_NAME':'douyu',数据库名称''DB_TABLE':'douyu'数据库表}MongoDB初始化client = pymongo.MongoClient(config['DB_URL'])mango_db = client[config['DB_NAME']]MongoDB存储def save_to_mango(result):if mango_db[config['DB_TABLE']].insert_one({'vid':result}):print('成功存储到MangoDB')return Truereturn FalseMongoDB验证重复def check_to_mongo(vid):count = mango_db[config['DB_TABLE']].find({'vid':vid}).count()if count==0:return Falsereturn True删除文件def del_file(page):if os.path.exists(page): 删除文件,可使用以下两种方法。os.remove(page) os.unlink(my_file)else:print('no such file:%s' % page)循环列表删除文件def loop_del_file(arr):for item in arr:del_file(item)请求器def get_content_requests(url):headers = {}headers['user-agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'headers['cookie'] = 'dy_did=07f83a57d1d2e22942e0883200001501; acf_did=07f83a57d1d2e22942e0883200001501; Hm_lvt_e99aee90ec1b2106afe7ec3b199020a7=1556514266,1557050422,1557208315; acf_auth=; acf_auth_wl=; acf_uid=; acf_nickname=; acf_username=; acf_own_room=; acf_groupid=; acf_notification=; acf_phonestatus=; _dys_lastPageCode=page_video,page_video; Hm_lpvt_e99aee90ec1b2106afe7ec3b199020a7=1557209469; _dys_refer_action_code=click_author_video_cate2'try:req_content = requests.get(url,headers = headers)if req_content.status_code == 200:return req_contentprint('请求失败:',url)return Noneexcept:print('请求失败:', url)return None把时间换算成秒def str_to_int(time):try:time_array = time.split(':')time_int = (int(time_array[0])60)+int(time_array[1])return time_intexcept:print('~~~~~计算视频时间失败~~~~~')return None提取需要采集的数据def get_list(html,type = 1):data = []try:list_json = json.loads(str(html))for om in list_json['data']['list']:gtime = str_to_int(om['video_str_duration'])if gtime > config['TIME_START'] and gtime < config['TIME_ENT']:if type == 2:data.append({'title': om['title'], 'vid': om['url'].split('show/')[1]})else:data.append({'title': om['title'], 'vid': om['hash_id']})return dataexcept:print('~~~~~数据提取失败~~~~~')return None解析playlist.m3u8def get_ts_list(m3u8):data = []try:html_m3u8_json = json.loads(m3u8)m3u8_text = get_content_requests(html_m3u8_json['data']['video_url'])m3u8_vurl =html_m3u8_json['data']['video_url'].split('playlist.m3u8?')[0]if m3u8_text:get_text = re.findall(',\n(.?).ts(.?)\n',m3u8_text.text,re.S)for item in get_text:data.append(m3u8_vurl+item[0]+'.ts'+item[1])return datareturn Noneexcept:print('~~~~~解析playlist.m3u8失败~~~~~')return None 杀死moviepy产生的特定进程def killProcess(): 处理python程序在运行中出现的异常和错误try: pids方法查看系统全部进程pids = psutil.pids()for pid in pids: Process方法查看单个进程p = psutil.Process(pid) print('pid-%s,pname-%s' % (pid, p.name())) 进程名if p.name() == 'ffmpeg-win64-v4.1.exe': 关闭任务 /f是强制执行,/im对应程序名cmd = 'taskkill /f /im ffmpeg-win64-v4.1.exe 2>nul 1>null' python调用Shell脚本执行cmd命令os.system(cmd)except:pass下载.ts文件def download_ts(m3u8_list,name):try:if not os.path.exists(config['FILE_PATH']):os.makedirs(config['FILE_PATH'])if not os.path.exists(config['TS_PATH']):os.makedirs(config['TS_PATH'])if os.path.exists(config['FILE_PATH']+name+'.mp4'):name = name+'_'+str(int(time.time()))print('开始下载:',name)L = []R = []for p in m3u8_list:ts_find = get_content_requests(p)file_ts = '{0}{1}.ts'.format(config['TS_PATH'],md5(ts_find.content).hexdigest())with open(file_ts,'wb') as f:f.write(ts_find.content)R.append(file_ts)hebing = VideoFileClip(file_ts)L.append(hebing)killProcess()print('下载完成:',file_ts)mp4file = '{0}{1}.mp4'.format(config['FILE_PATH'],name)final_clip = concatenate_videoclips(L)final_clip.to_videofile(mp4file, fps=24, remove_temp=True)killProcess()loop_del_file(R)print('\n下载完成:',name)print('')return Trueexcept:print('~~~~~合成.ts文件失败~~~~~')return None下载视频列表def list_get_kong(list_json):for item in list_json:y = Trueif config['CHECKID']:if check_to_mongo(item['vid']):print('~~~~~检测到重复项~~~~~')y = Falseif y:get_show_html = get_content_requests('https://vmobile.douyu.com/video/getInfo?vid=' + item['vid'])if get_show_html:m3u8_list = get_ts_list(get_show_html.text)if m3u8_list:download = download_ts(m3u8_list, item['title'])if download: save_to_mango(item['vid'])time.sleep(config['TIME_GE'])控制器def main(page):if config['TYPE']==1:print('~~~~~按用户ID采集~~~~~')listurl = 'https://v.douyu.com/video/author/getAuthorVideoListByNew?up_id={0}&cate2_id=0&limit=30&page={1}'.format(config['UID'],page)get_list_html = get_content_requests(listurl)if get_list_html:list_json = get_list(get_list_html.text,1)if list_json:list_get_kong(list_json)else:print('~~~~~按列表ID采集~~~~~')listurl = 'https://v.douyu.com/video/video/listData?page={1}&cate2Id={0}&action=new'.format(config['CID'],page)get_list_html = get_content_requests(listurl)if get_list_html:list_json = get_list(get_list_html.text,2)if list_json:list_get_kong(list_json)初始化if __name__=='__main__':if config['POOL']:groups = [x for x in range(config['PAGE_START'],config['PAGE_END']+1)]pool = Pool()pool.map(main, groups)else:for item in range(config['PAGE_START'],config['PAGE_END']+1):main(item)print('~~~~~已经完成【所有操作】~~~~~') 总结:众所周知,BiliBili是一个学习的网站! 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_35875470/article/details/89857445。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-18 11:34:00
119
转载
转载文章
...html Jsoup教程:https://www.jianshu.com/p/fd5caaaa950d 接下来,我通过Jsoup来实现爬取彼岸桌面里面的图片进行爬虫学习!!! 我用的开发工具是IDEA,jdk是1.7版本,项目结构大致如下所示: 一、页面分析 首先来分析一下彼岸桌面的网页的结构: 我们第一个看到的是网站的域名为http://www.netbian.com/,它有如上所示的分类,我们尝试着点开一些分类去看一下他的链接。 通过点击每个分类,发现不同的分类下,地址栏显示为域名后面拼接这对应分类的拼音,但在分类为王者荣耀之后的拼接的确是“s/分类拼音”。这样我们可以创建一个枚举类,将所有分类集中管理。在common包下创建一个Kind枚举类: package com.asahi.common;/ 分类的枚举/public enum Kind {RILI("rili"), DONGMAN("dongman"), FENGJING("fengjing"), MEINV("meinv"), YOUXI("youxi"), YINGSHI("yingshi"),DONGTAI("dongtai"), WEIMEI("weimei"), SHEJI("sheji"), KEAI("keai"), QICHE("qiche"), HUAHUI("huahui"),DONGWU("dongwu"), JIERI("jieri"), RENWU("renwu"), MEISHI("meishi"), SHUIGUO("shuiguo"), JIANZHU("jianzhu"),TIYU("tiyu"), JUNSHI("junshi"), FEIZHULIU("feizhuliu"), QITA("qita"), WANGZHERONGYAO("s/wangzherongyao"), HUYAN("s/huyan"), LOL("s/lol");String kind;Kind(String kind) {this.kind = kind;}public static boolean contains(String test) {for (Kind c : Kind.values()) {if (c.kind.equals(test)) {return true;} }return false;} } 这里我添加了一个比较的方法供之后判断输入的分类名是否包含在这些分类里面。 接下来我们在分析分类面的展示情况,以美女分类页面为例(●´∀`●),最下边有分页,如果只获取这个页面的图片并不能获取所有美女图,我们还需要点击每一个分页,从分页中获取所有的图片。通过分析发现,第一页的链接是在原有链接基础上拼接“/index.htm”,从第二页之后拼接的是“/index_页号.htm”。 这样我们只需要获取总页数在依次遍历拼接就可以了,现在的问题是如何获取总页数,我一开始的想法是获取分页中“共167页”这个标签后再只保留数字就可以个,但发现运行后获取不到该元素节点,经过排查了解到这个标签是通过js生成的,于是我转换了思路,通过获取最后一个页号来得到一共分了多少页 Document root_doc = Jsoup.connect("http://www.netbian.com/" + kind + "/").get();Elements els = root_doc.select("main .page a");//这里els.eq(els.size() - 2的原因是后边确定按钮用的是a标签要去掉,再去掉一个“下一页”标签Integer page = Integer.parseInt(els.eq(els.size() - 2).text()); 分类页中图片所在的标签结构为: 分类页面下的图片不是我们想要的,我们想要的是点击进去详细页的高清大图,所以需要获取a标签的链接,再从这个链接中获取真正想要的图片。 详细页中图片所在的标签结构为: 二、代码实现 到这里分类页分析的差不多了,我们通过代码来进行获取图片。首先导入Jsoup的jar包:jsoup-1.12.1.jar,如果采用Maven请导入下边的依赖。 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.12.1</version></dependency> 在utils创建JsoupPic类,并添加getPic方法,代码如下: public static void getPic(String kind) throws Exception {//get请求方式进行请求Document root_doc = Jsoup.connect("http://www.netbian.com/" + kind + "/").get();//获取分页标签,用于获取总页数Elements els = root_doc.select("main .page a");Integer page = Integer.parseInt(els.eq(els.size() - 2).text());for (int i = 1; i < page; i++) {Document document = null;//这里判断的是当前页号是否为1,如果为1就不拼页号,否则拼上对应的页号if (i == 1) {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index.htm").get();} else {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index_" + i + ".htm").get();}//获取每个分页链接里面a标签的链接,进入链接页面获取当前图拼的大尺寸图片Elements elements = document.select("main .list li a");for (Element element : elements) {String href = element.attr("href");String picUrl = "http://www.netbian.com" + href;Document document1 = Jsoup.connect(picUrl).get();Elements elements1 = document1.select(".endpage .pic p a img");//获取所有图片的链接System.out.println(elements1);} }} 在分类页中有一个隐藏的问题图片: 正常的图片链接都是以“/”开头,以“.htm”结尾,而每个分类下的第三张图片的链接都是“http://pic.netbian.com/”,如果不过滤的话会报如下错误: 所以这里必须要判断一下: Elements elements = document.select("main .list li a");for (Element element : elements) {String href = element.attr("href");//判断是否是以“/”开头if (href.startsWith("/")) {String picUrl = "http://www.netbian.com" + href;Document document1 = Jsoup.connect(picUrl).get();Elements elements1 = document1.select(".endpage .pic p a img");System.out.println(elements1);} } 到这里,页面就已经分析好了,问题基本上已经解决了,接下来我们需要将图片存到我们的系统里,这里我将图片保存到我的电脑桌面上,并按照分类来存储图片。 首先是要获取桌面路径,在utils包下创建Download类,添加getDesktop方法,代码如下: public static File getDesktop(){FileSystemView fsv = FileSystemView.getFileSystemView();File path=fsv.getHomeDirectory(); return path;} 接着我们再该类中添加下载图片的方法: //urlPath为网络图片的路径,savePath为要保存的本地路径(这里指定为桌面下的images文件夹)public static void download(String urlPath,String savePath) throws Exception {// 构造URLURL url = new URL(urlPath);// 打开连接URLConnection con = url.openConnection();//设置请求超时为5scon.setConnectTimeout(51000);// 输入流InputStream is = con.getInputStream();// 1K的数据缓冲byte[] bs = new byte[1024];// 读取到的数据长度int len;// 输出的文件流File sf=new File(savePath);int randomNo=(int)(Math.random()1000000);String filename=urlPath.substring(urlPath.lastIndexOf("/")+1,urlPath.length());//获取服务器上图片的名称filename=new java.text.SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date())+randomNo+filename;//时间+随机数防止重复OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename);// 开始读取while ((len = is.read(bs)) != -1) {os.write(bs, 0, len);}// 完毕,关闭所有链接os.close();is.close();} 写好后,我们再完善一下JsouPic中的getPic方法。 public static void getPic(String kind) throws Exception {//get请求方式进行请求Document root_doc = Jsoup.connect("http://www.netbian.com/" + kind + "/").get();//获取分页标签,用于获取总页数Elements els = root_doc.select("main .page a");Integer page = Integer.parseInt(els.eq(els.size() - 2).text());for (int i = 1; i < page; i++) {Document document = null;//这里判断的是当前页号是否为1,如果为1就不拼页号,否则拼上对应的页号if (i == 1) {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index.htm").get();} else {document = Jsoup.connect("http://www.netbian.com/" + kind + "/index_" + i + ".htm").get();}File desktop = Download.getDesktop();Download.checkPath(desktop.getPath() + "\\images\\" + kind);//获取每个分页链接里面a标签的链接,进入链接页面获取当前图拼的大尺寸图片Elements elements = document.select("main .list li a");for (Element element : elements) {String href = element.attr("href");if (href.startsWith("/")) {String picUrl = "http://www.netbian.com" + href;Document document1 = Jsoup.connect(picUrl).get();Elements elements1 = document1.select(".endpage .pic p a img");Download.download(elements1.attr("src"), desktop.getPath() + "\\images\\" + kind);} }} } 在Download类中,我添加了checkPath方法,用于判断目录是否存在,不存在就创建一个。 public static void checkPath(String savePath) throws Exception {File file = new File(savePath);if (!file.exists()){file.mkdirs();} } 最后在mainapp包内创建PullPic类,并添加主方法。 package com.asahi.mainapp;import com.asahi.common.Kind;import com.asahi.common.PrintLog;import com.asahi.utils.JsoupPic;import java.util.Scanner;public class PullPic {public static void main(String[] args) throws Exception {new PullPic().downloadPic();}public void downloadPic() throws Exception {System.out.println("启动程序>>\n请输入所爬取的分类:");Scanner scanner = new Scanner(System.in);String kind = scanner.next();while(!Kind.contains(kind)){System.out.println("分类不存在,请重新输入:");kind = scanner.next();}System.out.println("分类输入正确!");System.out.println("开始下载>>");JsoupPic.getPic(kind);} } 三、成果展示 最终的运行结果如下: 最终的代码已上传到我的github中,点击“我的github”进行查看。 在学习Java爬虫的过程中,我收获了很多,一开始做的时候确实遇到了很多困难,这次写的获取图片也是最基础的,还可以继续深入。本来我想写一个通过多线程来获取图片来着,也尝试着去写了一下,越写越跑偏,暂时先放着不处理吧,等以后有时间再来弄,我想问题应该不大,只是考虑的东西有很多。希望大家多多指点不足,有哪些需要改进的地方,我也好多学习学习๑乛◡乛๑。 本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_39693281/article/details/108463868。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-06-12 10:26:04
130
转载
转载文章
...de基础语法及使用 python3数据结构_Python3-数据结构 debezium-connect-oracle使用 相关数值分析多种算法代码 android iphone treeview,Android之IphoneTreeView带组指示器的ExpandableListView效果 nginx rewrite功能使用 3-3 OneHot编码 JavaWeb:shiro入门小案例 MySQL的定义、操作、控制、查询语言的用法 MongoDB入门学习(三):MongoDB的增删查改 赋值、浅复制和深复制解析 以及get/set应用 他是吴恩达导师,被马云聘为「达摩院」首座 Jordan 标准型定理 列主元的Gauss-Jordan消元法-python实现 Jordan 块的几何 若尔当型(The Jordan form) 第七章 其他神经网络类型 解决迁移系统后无法配置启用WindowsRE环境的问题 宝塔面板迁移系统盘/www到数据盘/home 使用vmware vconverter从物理机迁移系统到虚拟机P2V 本篇文章为转载内容。原文链接:https://blog.csdn.net/m0_62695120/article/details/124510157。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-03-08 20:01:49
68
转载
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
unset VAR
- 删除环境变量。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"