最近在开发过程中遇到一个sqlalchemy lost connection的报错,记录解决方法。
python后端开发,使用的框架是Fastapi + sqlalchemy。在一个接口请求中报错如下:
[2023-03-24 06:36:35 +0000] [217] [ERROR] Exception in ASGI application
Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/uvicorn/protocols/http/h11_impl.py", line 407, in run_asgi
result = await app( # type: ignore[func-returns-value]
File "/usr/local/lib/python3.8/dist-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__
return await self.app(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/fastapi/applications.py", line 199, in __call__
await super().__call__(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/starlette/applications.py", line 112, in __call__
await self.middleware_stack(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/starlette/middleware/errors.py", line 181, in __call__
raise exc from None
File "/usr/local/lib/python3.8/dist-packages/starlette/middleware/errors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "/usr/local/lib/python3.8/dist-packages/starlette/middleware/base.py", line 26, in __call__
await response(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/starlette/responses.py", line 224, in __call__
await run_until_first_complete(
File "/usr/local/lib/python3.8/dist-packages/starlette/concurrency.py", line 24, in run_until_first_complete
[task.result() for task in done]
File "/usr/local/lib/python3.8/dist-packages/starlette/concurrency.py", line 24, in <listcomp>
[task.result() for task in done]
File "/usr/local/lib/python3.8/dist-packages/starlette/responses.py", line 216, in stream_response
async for chunk in self.body_iterator:
File "/usr/local/lib/python3.8/dist-packages/starlette/middleware/base.py", line 56, in body_stream
task.result()
File "/usr/local/lib/python3.8/dist-packages/starlette/middleware/base.py", line 38, in coro
await self.app(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/starlette_exporter/middleware.py", line 289, in __call__
await self.app(scope, receive, wrapped_send)
File "/usr/local/lib/python3.8/dist-packages/starlette/exceptions.py", line 82, in __call__
raise exc from None
File "/usr/local/lib/python3.8/dist-packages/starlette/exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "/usr/local/lib/python3.8/dist-packages/starlette/routing.py", line 580, in __call__
await route.handle(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/starlette/routing.py", line 241, in handle
await self.app(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/starlette/routing.py", line 55, in app
await response(scope, receive, send)
File "/usr/local/lib/python3.8/dist-packages/starlette/responses.py", line 146, in __call__
await self.background()
File "/usr/local/lib/python3.8/dist-packages/starlette/background.py", line 35, in __call__
await task()
File "/usr/local/lib/python3.8/dist-packages/starlette/background.py", line 20, in __call__
await run_in_threadpool(self.func, *self.args, **self.kwargs)
File "/usr/local/lib/python3.8/dist-packages/starlette/concurrency.py", line 40, in run_in_threadpool
return await loop.run_in_executor(None, func, *args)
File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/app/ymir_app/app/libs/datasets.py", line 330, in ats_import_dataset_in_backgroud
task = crud.task.create_placeholder(
File "/app/ymir_app/app/crud/crud_task.py", line 81, in create_placeholder
db.commit()
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 1428, in commit
self._transaction.commit(_to_root=self.future)
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 829, in commit
self._prepare_impl()
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 808, in _prepare_impl
self.session.flush()
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 3298, in flush
self._flush(objects)
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 3438, in _flush
transaction.rollback(_capture_exception=True)
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
compat.raise_(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/util/compat.py", line 207, in raise_
raise exception
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 3398, in _flush
flush_context.execute()
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/unitofwork.py", line 456, in execute
rec.execute(self)
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/unitofwork.py", line 630, in execute
util.preloaded.orm_persistence.save_obj(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/persistence.py", line 242, in save_obj
_emit_insert_statements(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/persistence.py", line 1219, in _emit_insert_statements
result = connection._execute_20(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1582, in _execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
return connection._execute_clauseelement(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1451, in _execute_clauseelement
ret = self._execute_context(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1813, in _execute_context
self._handle_dbapi_exception(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1994, in _handle_dbapi_exception
util.raise_(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/util/compat.py", line 207, in raise_
raise exception
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1770, in _execute_context
self.dialect.do_execute(
File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/default.py", line 717, in do_execute
cursor.execute(statement, parameters)
File "/usr/local/lib/python3.8/dist-packages/pymysql/cursors.py", line 148, in execute
result = self._query(query)
File "/usr/local/lib/python3.8/dist-packages/pymysql/cursors.py", line 310, in _query
conn.query(q)
File "/usr/local/lib/python3.8/dist-packages/pymysql/connections.py", line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/usr/local/lib/python3.8/dist-packages/pymysql/connections.py", line 775, in _read_query_result
result.read()
File "/usr/local/lib/python3.8/dist-packages/pymysql/connections.py", line 1156, in read
first_packet = self.connection._read_packet()
File "/usr/local/lib/python3.8/dist-packages/pymysql/connections.py", line 692, in _read_packet
packet_header = self._read_bytes(4)
File "/usr/local/lib/python3.8/dist-packages/pymysql/connections.py", line 748, in _read_bytes
raise err.OperationalError(
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
[SQL: INSERT INTO task (name, hash, type, state, parameters, config, percent, duration, error_code, user_id, project_id, dataset_id, model_stage_id, is_terminated, is_deleted, last_message_datetime, create_datetime, update_datetime) VALUES (%(name)s, %(hash)s, %(type)s, %(state)s, %(parameters)s, %(config)s, %(percent)s, %(duration)s, %(error_code)s, %(user_id)s, %(project_id)s, %(dataset_id)s, %(model_stage_id)s, %(is_terminated)s, %(is_deleted)s, %(last_message_datetime)s, %(create_datetime)s, %(update_datetime)s)]
[parameters: {'name': 't0000001000012b2ae341679639795', 'hash': 't0000001000012b2ae341679639795', 'type': 5, 'state': 1, 'parameters': '{"group_name": "from_ats_6579a9116a", "description": null, "project_id": 12, "input_url": null, "input_dataset_id": null, "input_dataset_name": null, "input_path": "/data/ymir-workplace/ymir-sharing/3c87e23bb8904b638a9479d6e68aea23", "strategy": 4, "source": 5, "import_type": 5}', 'config': None, 'percent': 0, 'duration': None, 'error_code': None, 'user_id': 1, 'project_id': 12, 'dataset_id': None, 'model_stage_id': None, 'is_terminated': 0, 'is_deleted': 0, 'last_message_datetime': datetime.datetime(2023, 3, 24, 6, 36, 35, 351864), 'create_datetime': datetime.datetime(2023, 3, 24, 6, 36, 35, 351870), 'update_datetime': datetime.datetime(2023, 3, 24, 6, 36, 35, 351873)}]
(Background on this error at: http://sqlalche.me/e/14/e3q8)
主要报错信息是:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
在网上搜了很多答案包括:
设置sqlalchemy 回收链接的时间为10分钟 pool_recycle
engine = create_engine(url, pool_recycle=600)
设置每次session操作之前检查 pool_pre_ping
engine = create_engine("mysql+pymysql://user:pw@host/db", pool_pre_ping=True,pool_recycle=1800)
不使用连接池
engine = create_engine("mysql+pymysql://user:pw@host/db", pool_pre_ping=True,pool_recycle=-1)
检查数据库设置的连接超时时间
经过以上一些列操作还是不能解决问题。于是仔细分析这个问题出现的原因。
从字面意思来看就是数据库在查询时丢失了连接,这里的连接也就是session。这个接口是一个操作很多的任务,要下载大量数据集,通常在20G以上,所以设计成异步接口。请求接口之后获取一个数据库session,然后处理简单任务直接返回一个成功的状态,最后将耗时任务放在后台任务完成。这里的后台任务是Fastapi自身的功能,专门用于处理一些小型的耗时任务,如发送邮件等。lost connect 就是发生在后台任务中。
抽象任务流程:
所以通过分析这个任务的流程可以发现是持有session过长导致的。从接口请求的开始就获取了该session,然后将session传递到后台任务中,经过30分钟之后才再次使用该session,就发生了lost connection的问题。
知道问题症状所在就知道如何对症下药的了,就是在后台下载任务30分钟之后更新数据库时重新获取一个session,不复用之前的session,这样就就解决了这个问题。
这个问题之所以没有发现是因为按照官网的介绍pool_recycle字段就是负责回收session,配合pool_pre_ping每次使用session之前检查一次就能解决这个session断联的问题。但是似乎在配置的pool_recycle醒没有生效。
可能这个问题是我自身没配置好导致的,但是也可以作为解决此类问题的一个思路。遇到类似问题排查时思考一下,是不是持有session时间过长。
【解题思路】:选择其中一棵树(如左边root1的树)作为最终输出的树,然后将另外一棵树叠加到这棵树上。 【注意事项】:遍历到输出树root1节点为空,而叠加树root2节点非空时,直接把root2作为root1即可,但需要额外传参才能完成root1的父节点;root1是父节点的左子树还是右子树DFS/** *Definitionforabinarytreenode. *structTreeNode{ *intval; *TreeNode*left; *TreeNode*right; *TreeNode():val(0),left(nullptr),right(nullptr){} *TreeNode(intx):val(x),left(nullptr),right(nullptr){} *TreeNode(intx,TreeNode*left,TreeNode*right):val(x),left(left),right(right){} *}; */ classSolution{ public: voiddfs(TreeNode*parent1,TreeNode*root1,Tre
维护一个字符串集合,支持两种操作:“Ix”向集合中插入一个字符串x;“Qx”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过\rm{10^5},字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为“Ix”和“Qx”中的一种。输出格式对于每个操作指令“Qx”,都要输出一个整数作为结果,表示x在集合中出现的次数。每个结果占一行。数据范围\rm{1}\leN\le2*{10^4}输入样例5 Iabc Qabc Qab Iab Qab复制输出样例1 0 1复制题解(Trie树)数据结构 插入操作: 从根节点开始,枚举当前字符串,如果对应字母节点存在,则进入下一个节点,否则创建节点。字符串枚举完成后,创建当前节点单词结尾标记。 查询操作: 同插入操作,如果任意一个字母节点不存在,则意味着该字符串一定不存在,否则继续枚举,最终范围尾节点的单词结尾标记。C++代码#include<iostream> usingnamespacestd; constintN=100010; intson[N][26];//
论文地址: AutoML:Asurveyofthestate-of-the-art[1]最近看了些NAS的论文,发现上面这篇综述写的很不错,非常全面,详细拜读了一下。有很多细节不是很懂,也没空去精读原论文,但是能够对大致的脉络有个初步的了解。因此简单写一下这篇综述讲了些啥,第一次接触NAS,可能有理解有误,望指正批评。介绍首先这篇综述是讲AutoML的,不单单是NAS,但是因为NAS是AutoML中最最重要的一部分,所以主要篇章还是用来讲NAS了。据作者所说,应该是第一篇完整讲述AutoML整个流程的综述。首先,本文将AutoML划分成了如下几个流程:先是数据准备,然后是特征工程,接着是模型生成,最后就是模型评估了。其中模型生成又可以分为搜索空间和优化方法,搜索空间有传统的ML模型或者DL模型,优化方法又分为超参数优化和结构优化。NAS的话主要就涉及到DL模型的搜索空间定义、结构优化和模型评估策略这三块。 因为我主要关注NAS这块,所以其他部分就只简单介绍一下,不做过多解读。数据准备看上面这个图应该很清楚了,数据准备主要分为数据收集、数据清洗和数据增强三个部分。 数据收集有开源的就去下
STM32单片机极简方法使用宏定义代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)https://blog.csdn.net/wu10188/article/details/97786989这个方式有助于编写好的工程。stm32添加串口调试https://blog.csdn.net/dream_feng/article/details/83504862按照这个方式,添加成功。首先在stm32中添加SWO输出功能,在uart.c中添加如下代码,作为printf的重定向。#ifdef__GNUC_ #definePUTCHAR_PROTOTYPEint__io_putchar(intch) #else #definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f) #endif #ifdefSWO_PRINTF PUTCHAR_PROTOTYPE { ITM_SendChar(ch); returnch; } #else //重定义fputc函数 PUTCHAR_PROTOTYPE { RS485PA8_TX; HAL_UART_Tran
Bean定义中的使用求值支持的功能函数Bean引用If-Then-ElseElvisSafeNavigation运算符集合选择集合投影表达式模板化SpEL的全称叫做SpringExpressionLanguage。通常是为了在XML或者注解里面方便求值用的,通过编写#{<expressionstring>}这样的格式,即可使用。Bean定义中的使用XML配置可以用SpEL设置属性或构造函数参数值,如下示例所示:<beanid="numberGuess"class="com.flydean.beans.NumberGuess"> <propertyname="randomNumber"value="#{T(java.lang.Math).random()*100.0}"/> <!--otherproperties--> </bean>复制Spring内置了很多预定义变量,如SystemProperties,你可以像下面这样直接引用它:<bea
如果你想从头学习Jmeter,可以看看这个系列的文章哦https://www.cnblogs.com/poloyy/category/1746599.html测试计划的作用测试计划描述了Jmeter在执行时,一系列的步骤一个完整的测试计划包含了一个或多个【线程组、逻辑控制器、采样器、监听器、定时器、断言和配置元素】测试计划添加or删除元件通过右键点击树中的元件,选中要添加的元件也可以通过合并(merge)或打开(open)从文件中加载和添加元件配置树中的元件树中的每一个控件都能通过右边内容区显示树中的每一个控件都能在树中随意拖动运行测试计划可以通过ctrl+r运行测试计划通过右侧的数字:活动线程数/线程总数,这仅适用于本地运行的测试;使用客户端-服务器模式时,它们不包括在远程系统上启动的任何线程【分布式压测时,master机不会显示所有远程salve机的线程总数】特别注意仅在调试测试计划时,才应该使用上面的GUI模式【界面模式】,如果实际运行负载测试的时候,应该使用CLI模式【命令行模式、无界面模式】暂停运行测试计划两种暂停方式停止线程(ctrl+.)【硬中断】关闭线程(ctrl+,)
关键字:python正文|内容今天这篇文章主要是介绍: 小面包(Breadbot)是一款功能强大,简单易部署的聊天AI01—小面包工作于Linux,当然,你也可以通过修改代码使其工作于Windows.下载:gitclonehttps://gitee.com/ideamark/breadbot安装:首先,确保你已经安装了python3,python3-pip,python3-dev,gcc,redis-server.执行安装命令:python3setup.pyinstall安装过程中会下载语料卸载:python3setup.pyuninstall清理(不是卸载):python3setup.pyclean快速启动输入命令redis-server在本地6379端口启动Redis数据库。输入命令breadbot启动小面包终端。输入命令import导入语料数据。然后你就可以和小面包对话了,输入help可以查看更多信息。0—获取源码https://gitee.com/ideamark/breadbot.git03—更多视频专辑Springboot开发视频微信:andyquanhua【微信二维码,扫
本文主要是实现了一个简单的卷积神经网络,并对卷积过程中的提取特征进行了可视化.卷积神经网络最早是为了解决图像识别的问题,现在也用在时间序列数据和文本数据处理当中,卷积神经网络对于数据特征的提取不用额外进行,在对网络的训练的过程当中,网络会自动提取主要的特征. 卷积神经网络直接用原始图像的全部像素作为输入,但是内部为非全连接结构.因为图像数据在空间上是有组织结构的,每一个像素在空间上和周围的像素是有关系的,和相距很远的像素基本上是没什么联系的,每个神经元只需要接受局部的像素作为输入,再将局部信息汇总就能得到全局信息. 权值共享和池化两个操作使网络模型的参数大幅的减少,提高了模型的训练效率. 权值共享: 在卷积层中可以有多个卷积核,每个卷积核与原始图像进行卷积运算后会映射出一个新的2D图像,新图像的每个像素都来自同一个卷积核.这就是权值共享.池化: 降采样,对卷积(滤波)后,经过激活函数处理后的图像,保留像素块中灰度值最高的像素点(保留最主要的特征),比如进行2X2的最大池化,把一个2x2的像素块降为1x1的像素块. Padding卷积核在提取特征时的动作成为padding,它
一、问题背景与分析不久前,团队发现其Android平台App在播放MV视频《凤凰花开的路口》时,会带有如电流声一般的杂音,这影响了用户体验。 研发同学在初步定位时,发现有如下特征:Android平台杂音问题必现;iOS、PC平台能正常播放,没有噪音。然而,各平台都是统一用HLS格式播放,即源头都是一样的。对于该问题,我们的定位思路如下:梳理视频播放流程;找到切入点排查。二、播放流程概览分析播放流程如上图(图中内容从左往右),概括其关键步骤如下: 播放器初始化:创建读数据线程:read_thread;创建存放audio解码前数据的队列:audioq;创建存放audio解码后数据的队列:sampq。数据读取:①创建context;②探测协议类型:avformat_open_input;③探测媒体类型:avformat_find_stream_info;④获取音视频流:av_find_best_stream;⑤打开媒体解码器:stream_component_open;⑥读取媒体数据,获得AVPacket:av_read_frame(ic,pkt);⑦音视频数据分别送入audioq中;重复⑥
原作者 RogerJin 编译CDA编译团队本文为 CDA数据分析师原创作品,转载需授权 开发人员应该选择在哪儿工作? 如今,美国35%的劳动力是自由职业者,开创自己的职业道路正在成为常态。但如果你想找一份称心如意的工作,那么你将面临两个选择:顶级的科技公司还是优秀的机构。 开发人员想要什么? 一个优秀的开发者不会只为了钱而编程,而是想做出影响力。软件开发者RobWalling列出整理了开发者在职业和生活方面想要什么。受他的列表的启发,以下是软件开发人员特别关注的方面: ·处于促进个人发展的环境中;·具有良好的管理能力来完成项目;·学习新的事物,锻炼创造力;·开发有意义的项目;·并非每个步骤都需要获得批准;·较少的约束有趣的是,公司的研究表明,虽然薪酬是软件工程师离职的最常见因素,但他们会接受一份薪水较低,但有出色企业文化的工作。 DanielPink在书《Drive》中阐述了员工的动机。除了金钱之外,人们被自主性、掌控力和目的所激励。简而言之,当工资能够负担平日开销时,人们会对那些没有标价的福利更感兴趣。 虽如此,但每个人都有独特的需求,下面让我们就顶尖技术公司和顶级机构对开发者的薪
一、解释下应用服务层应用服务用于将领域(业务)逻辑暴露给展现层。展现层通过传入DTO(数据传输对象)参数来调用应用服务,而应用服务通过领域对象来执行相应的业务逻辑并且将DTO返回给展现层。因此,展现层和领域层将被完全隔离开来。 以下几点,在创建应用服务时需要注意:在ABP中,一个应用服务需要实现IApplicationService接口,最好的实践是针对每个应用服务都创建相应继承自IApplicationService的接口。(通过继承该接口,ABP会自动帮助依赖注入)ABP为IApplicationService提供了默认的实现ApplicationService,该基类提供了方便的日志记录和本地化功能。实现应用服务的时候继承自ApplicationService并实现定义的接口即可。ABP中,一个应用服务方法默认是一个工作单元(UnitofWork)。ABP针对UOW模式自动进行数据库的连接及事务管理,且会自动保存数据修改。二、定义ITaskAppService接口1,先来看看定义的接口publicinterfaceITaskAppService:IApplicationServi
Java实现抽奖模块的相关分享最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下。一、DAO层/** *获取奖品列表 *@paramsystemVersion手机系统版本(1-安卓2-iOS) *@Date:2021/6/7 */ List<LuckyPrize>getPrizeList(intsystemVersion);复制二、mapper.xml<selectid="getPrizeList"> SELECT* FROMsystem_cardsc LEFTJOINlucky_prizelpONsc.system_card_id=lp.system_card_id WHEREsc.`status`=1 ANDsc.category=3 ANDsc.system_version=#{systemVersion} </select>复制三、service层//签到抽奖 LuckyPrizeVostartSignDraw(IntegersystemVersion)
GO的环境配置? GOPATHGOROOT都是干嘛用的? 配置环境跟java对比有点奇怪 https://blog.csdn.net/weixin_40563757/article/details/115476327 语言特性 协程? 建立一个协程很简单加一个go关键字就可以 packageconcurrence import( "fmt" "time" ) funchello(iint){ println("hellogoroutine:"+fmt.Sprint(i)) } funcHelloGoRoutine(){ fori:=0;i<5;i++{ gofunc(jint){ hello(j) }(i) } time.Sleep(time.Second) } 复制 通过通信共享内存而不是通过共享内存而实现通信? 先提供一个或多个高性能队列,线程/进程/微服务之间需要访问别人时,不能直接读写别人的数据,而要通过队列提出请求,然后在对方处理请求时再做相应处理。 Q&A Q:我对java比较熟悉,java里面通过锁来实现共享内存,从而实现
“低质客户很讨厌。他们所关注的都是尽可能低的价格,对你的工作量、工作完成时间提出不合理的要求,甚至还不可避免地要求你使用你不喜欢的设计类型。”这听起来是不是很熟悉?那么,你很可能也遭遇过这样的客户。我们几乎都有过类似经历,尤其是在公司刚刚起步的时候。那么,如何避免为低质客户工作呢?你应该吸引更高质量的客户。如何做?这里并无捷径可言,你需要调整对待客户的态度和方法。 一、摒弃不顾一切——让他们离不开你 为低质客户工作的第一种情况就是你表现出了不顾一切的态度。作为一名自由职业者或创业者,你在金字塔的底层艰难度日,所以不顾一切地抓住了所能获得的第一个客户,而这时的客户往往是低质量的: 1.关注低价 不合理的工作量和交付时间 要求使用你所不喜欢的设计 不惜一切代价避免服务客户时的极度渴望情绪。相反,要让客户离不开你。 挑选客户要有选择性,当你对服务对象变得挑剔,客户自然会变得高质量,他们会: 2. 根据你的价值出价 赞同商定的工作数量和交付时间 赞同你所喜欢的设计类型 当你与那些从服务低质客户转向高质客户的设计师交谈时,他们达成的共识是:不需要客户,是吸引更高质量客户的最重
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<queue> usingnamespacestd; constintmaxn=1e6+10; constintmod=1e9+7; typedeflonglongll; lltt[maxn]; structnode{ chars[maxn]; intLyndon_end[maxn]; intcoun; voidget_Lyndon() { coun=0; intN=strlen(s),j,k,len=1; for(inti=0;i<N;){ j=i;k=i+1; len=1; tt[i]=i; while(k<=N&&s[j]<=s[k]){ if(s[j]<s[k]){//代表循环扩张 j=i; len=k-i+1; tt[k]=i; } else{ j++;//代表循环接着了
原文:https://www.cnblogs.com/plokmju/p/android_Handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不允许Activity新启动的线程访问该Activity里的UI组件,这样会导致新启动的线程无法改变UI组件的属性值。但实际开发中,很多地方需要在工作线程中改变UI组件的属性值,比如下载网络图片、动画等等。本篇博客主要介绍Handler是如何发送与处理线程上传递来的消息,并讲解Message的几种传递数据的方式,最后均会以小Demo来演示。 Handler Handler,它直接继承自Object,一个Handler允许发送和处理Message或者Runnable对象,并且会关联到主线程的MessageQueue中。每个Handler具有一个单独的线程,并且关联到一个消息队列的线程,就是说一个Handler有一个固有的消息队列。当实例化一个Handler的时候,它就承载在一个线程和消息队列的线程,这个Handler
1#coding=utf-8 2#Createdbydandingat2019/10/31 3 4frommathimport* 5 6defjiechenghe(num): 7list=[] 8k=1 9foriinrange(1,num+1): 10k=k*i 11list.append(k) 12sum=0 13foriinlist: 14sum+=i 15 16print('前{}项的阶乘和是:{}'.format(num,sum)) 17 18while1: 19try: 20num=input('提示:输入"q"退出程序。\n请输入前几项数字的阶乘和:') 21ifnum.lower()=='q': 22break 23num=int(num) 24except: 25print('请输入数!') 26continue 27jiechenghe(num)复制
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5040 题意:从'M'到 'T'最短路程,每次只能走四个方向,并且有一些摄像头每个时间点都会转变下方向(初始方向给出).你有一个box,你在没有罩box的情况下不能被照到,可以在点上等待,也可以罩着box走(时间会慢成3个单位)。 思路:就是一个最短路问题,只要算出在当前时间点u->v最多要花多时间才能到就行了(最多是3),用spfa跑。 1#include<cstdio> 2#include<cstring> 3#include<algorithm> 4#include<vector> 5#include<queue> 6 7usingnamespacestd; 8typedefpair<int,int>PII; 9constintMAXN=505; 10constintdir[4][2]={-1,0,0,1,1,0,0,-1};//NESW 11constintINF=0x3f3f3f3f
1、《我与计算机》①我是张淑雅,第一次接触计算机是在小学五六年级的时候,那时候觉得计算机很神秘。觉得计算机就是个百宝箱,想干啥都行,计算机知道你不知道的任何东西。后来接触到了计算机,期初没有网络,就在上面晚一些4399之类的游戏。小学的时候机房的电脑都是2、3人一台,到了初中,学校的电脑都是一人一台一位的,所以在计算机老师的带领下,我又学到了好多东西,打字软件、Office办公软件。初中学习紧任务重,再没怎么琢磨电脑,有时就是打打字,看看电影什么的。中招考试年后,因为成绩的不理想,最终在普高和职高的选择下,选择了职高,当然是计算机专业。以为学了这个专业肯定能成为心目中的“黑客”什么的,到了开学,一切跟我想象的都不一样了。什么VisualBasic什么ACCESS数据库、组装与维护、计算机网络,更让我纠结的就是计算机的构造、路由器交换机。其实让我感兴趣的是VB,一款基础的编程软件,有许多控件供你选择,代码也是很好理解在现在的我看来,于是我学习VB很认真,在一次家长会我展示了自己“开发”的一个小程序吧,其实这个程序没什么特别的,就是把许多程序集中到一个程序里,再加以美观外表。高中毕业了,来
目录前端项目搭建准备流程1.客户端项目搭建1.1创建项目目录1.2初始化项目1.3安装路由vue-router1.3.1下载安装路由组件1.3.2配置路由1.3.2.1初始化路由对象1.3.2.2注册路由信息1.3.2.3在视图中显示路由对应的内容1.3.3路由对象提供的操作1.3.3.1页面跳转(站内)1.3.3.1.1router-link标签跳转1.3.3.1.2this.$router.push()跳转1.3.3.2参数传递1.3.3.2.1获取查询字符串1.3.3.2.2获取路由参数2.ElementUI2.1快速安装ElementUI2.2配置ElementUI到项目中2.3注意点3.首页3.1创建首页组件3.1.1创建首页对应的路由 前端项目搭建准备流程 1.客户端项目搭建 1.1创建项目目录 cd项目目录[荏苒资讯] vueinitwebpackrenran 复制 例如,我要把项目保存在桌面下的子目录renran~/Desktop/renran,可以如下操作: cdDesktop/renran vueinitwebpackrenran_pc 复制 打开项目已经,在py