今天来聊聊薛定谔

本文仅代表作者观点,欢迎交流

薛定谔和薛定谔的猫

薛定谔的猫

实验描述如下:

把一只猫关在一个封闭的铁容器里面,并且装置以下仪器(注意必须确保这仪器不被容器中的猫直接干扰):在一台盖革计数器内置入极少量放射性物质,在一小时内,这个放射性物质至少有一个原子衰变的概率为50%,它没有任何原子衰变的概率也同样为50%;假若衰变事件发生了,则盖革计数管会放电,通过继电器启动一个榔头,榔头会打破装有氰化氢的烧瓶。经过一小时以后,假若没有发生衰变事件,则猫仍旧存活;否则发生衰变,这套机构被触发,氰化氢挥发,导致猫随即死亡。用以描述整个事件的波函数竟然表达出了活猫与死猫各半纠合在一起的状态。

该实验的核心思想:

1、封闭容器中的猫,50%几率会死亡,50%几率会存活
2、只有打开容器,才能知道猫的状态。也就是说,猫的状态取决于观察者(你)

生活中的薛定谔

讲讲我最近的一个真实经历吧:
最近做了个项目,主要由我来负责。大致需要我做的是:
提供一个接口,该接口功能如下:接受一串入参-->将入参带入模型-->记录入参、时间等参数至数据库-->将模型结果返回。
由于接口功能不算复杂,且给予的时间并不是很多,我选了使用python+flask+sqlalchemy+mysql的项目构架。


顺利地完成开发并部署后,一切貌似都进行得很顺利。
直到有一天,小伙伴跟我说,你这个项目,经常会出现一个现象:
“同样的入参,第一次访问会返回错误,下一次和后面几次就正常返回,过段时间后又会返回错误。”
既然是这样的描述,那我就看看日志记录呗。结果一看:

大致的错误是:MySQL server has gone away

每次接口的访问错误,都是这个。


mysql server has gone away

欧,好吧,看来是sql_alchemy的锅。有问题,那我们就着手解决问题吧。
感谢谷歌大大的帮助。我找到了如下答案和sqlalchemy官方给出的解决方案

# sqlalchemy 1.2
engine = create_engine("mysql+pymysql://user:pw@host/db", pool_pre_ping=True)
# before sqlalchemy 1.2
from sqlalchemy import exc
from sqlalchemy import event
from sqlalchemy import select

some_engine = create_engine(...)

@event.listens_for(some_engine, "engine_connect")
def ping_connection(connection, branch):
    if branch:
        # "branch" refers to a sub-connection of a connection,
        # we don't want to bother pinging on these.
        return

    # turn off "close with result".  This flag is only used with
    # "connectionless" execution, otherwise will be False in any case
    save_should_close_with_result = connection.should_close_with_result
    connection.should_close_with_result = False

    try:
        # run a SELECT 1.   use a core select() so that
        # the SELECT of a scalar value without a table is
        # appropriately formatted for the backend
        connection.scalar(select([1]))
    except exc.DBAPIError as err:
        # catch SQLAlchemy's DBAPIError, which is a wrapper
        # for the DBAPI's exception.  It includes a .connection_invalidated
        # attribute which specifies if this connection is a "disconnect"
        # condition, which is based on inspection of the original exception
        # by the dialect in use.
        if err.connection_invalidated:
            # run the same SELECT again - the connection will re-validate
            # itself and establish a new connection.  The disconnect detection
            # here also causes the whole connection pool to be invalidated
            # so that all stale connections are discarded.
            connection.scalar(select([1]))
        else:
            raise
    finally:
        # restore "close with result"
        connection.should_close_with_result = save_should_close_with_result

使用了官方给出的解决方案(在每次与数据库连接之前,检查一下连接可用性,如果失去了连接,就发送一个'Select 1'命令,重新建立连接)

大家看到这里,肯定都不耐烦了吧😂
读者:作者你在干啥!!废话一大堆,还po代码,是不是为了凑字数啊!!💢💢
读者老爷!我写这么多(有点凑字数嫌疑🤫),肯定是有目的的。不要急哈~
读者:不要糊弄我!😠

修改并部署了以后,确实一切正常了,而且很长一段时间内,没有任何错误返回。但是,虽然一直没有错误,但是,问题来了:你没有办法证明,这个接口一直是好的呀,也许99次访问是好的,谁知道第100次是不是好的,第1000次,第10000次呢......
我的小伙伴笑称:这简直是“薛定谔的正确性”啊。(请允许我杜撰一下这个概念)

对,他说的没错。下一次的返回,一直是两种可能:正确、错误。但是这个结果只有在你发起下一次访问之后才能得知。

薛定谔无处不在

从这次这个项目出发,我得出了一个让人很“绝望”的事实:证明错误(一件事、一个物)的方法千千万,证明正确的方法几乎不存在,因为下一刻的事情,往往是“薛定谔”的,只有在下一刻才能得知。

由此推理:证明一个人是坏人的方法千千万,证明一个人是好人的方法几乎没有!因为是“薛定谔”的。这对于我一个又红又专的青年简直是沉重的打击。我根本无法证明我下一刻是否是好人,因为在这一刻看下一刻的我,50%可能是好人,50%可能是坏人。

那,我怎么让我的小伙伴相信我的修改,确实能做到“不出错”呢?
答案:我在每次检查到“MySQL server has gone away”的时候,在日志中打印一下。

print 'SELECT 1'

这样,1、证明了确实还存在失去连接的情况 2、证明我确实重新连接了 3、接口返回正确
用这样的方法,证明了,我的方法生效了,至少大大提高了我的修改的可靠性!

那么,证明“我自己”是好人的方法,也呼之欲出了:

但行好事,莫问前程

这个引用可能不太恰当,但是这句话就一下子从脑子里蹦出来了,欢迎大家给出批评指导意见!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 世界上有许多著名的猫:Kitty、加菲猫、哆啦A梦、Tom……而科学界最著名的猫,大概就是“薛定谔的猫”了。薛定谔...
    罗素的茶壶阅读 25,757评论 73 685
  • 要认识神秘的量子纠缠,首先要认识神秘的量子现象。 不管是学哪个行业的,大概都听说过奇妙的量子现象。诸如测不准原理啦...
    josephok阅读 1,856评论 1 16
  • 文/苏央 不知道有多少听过“薛定谔的猫”这个词呢? 你第一次听到这个词是因为网剧《薛定谔的猫》吗? 还是对此一点都...
    苏央_良善雅痞阅读 2,068评论 13 23
  • ✨编者按:针对于目前大量的灵修,宗教以及商家,偷换量子理论的概念,以达到其目的,特转发张天荣老师的科普系列文章《走...
    小义子_正版阅读 1,314评论 2 5
  • 《彗星来的那一夜》,据说这部影片很烧脑,为了挑战一下,我独自一人看了,看之前没看任何影评。My god,好算没留在...
    素心and慧心阅读 1,581评论 0 5