我看完之后,当时就惊呆了。...我们在写代码前大致是要先找到NFC读卡器说明文档和银行卡相关规范,了解其工作过程。...NFC读卡器发送请求数据给银行卡,然后银行卡响应数据,发送和响应的这些数据都是十六进制表示的,在银行卡规范中均有详细说明。知道了命令之后,就是测试。...库: sudo apt-get install pcscd git python3-setuptools swig gcc libpcsclite-dev python3-dev sudo echo "...程序及资料: NFC资料代码 后记:其实上面的演示,你只要有个NFC读卡器就行,这个是最重要的,然后我的python程序是在window10上写的,之后放到了树莓派中。
背景:半年前,我从网上看到一个视频,讲的大概是一个人站在了一个人的旁边,待了几秒,然后就知道了那个人的银行卡信息了,而且不仅是银行卡信息,甚至连持卡人的姓名,身份证号都有。我看完之后,当时就惊呆了。...我们在写代码前大致是要先找到NFC读卡器说明文档和银行卡相关规范,了解其工作过程。...NFC读卡器发送请求数据给银行卡,然后银行卡响应数据,发送和响应的这些数据都是十六进制表示的,在银行卡规范中均有详细说明。知道了命令之后,就是测试。...库: sudo apt-get install pcscd git python3-setuptools swig gcc libpcsclite-dev python3-dev sudo echo "...程序及资料: NFC资料代码 后记:其实上面的演示,你只要有个NFC读卡器就行,这个是最重要的,然后我的python程序是在window10上写的,之后放到了树莓派中。
相比之下,Python的os.fork()是唯一返回两次的函数,任何返回两次的函数,在某种意义上,都可以调用os.fork()来实现。在调用fork()之后,就同时存在两个正在运行程序的拷贝。...在子进程终止后,必须调用wait()函数,否则系统系统资源会被大量的zombie进程消耗掉,最终会使服务器不可用。 操作系统可以非常容易地完成这个工作。...三、fork()性能 由于fork()函数每次在客户端连接的时候必须在整个服务器中拷贝,所以或许有人会认为它是一个很慢的方法。事实上,fork()的性能对于几乎所有具有高负载的系统来说是可忽略的。...子进程会在fork()之后立刻终止,父进程在sleep,能看出子进程出现了zombie,可以从第三列中的Z和输出最后的看出来。一旦父进程终止了,将可以确定两个进程都不存在了。...如果系统不能执行fork,os.fork()函数可以产生异常。为了防止服务器当机,必须处理这个异常。
假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。...bin/env python #coding=utf8 def createDaemon(): import os, sys, time #产生子进程,而后父进程退出 try: pid = os.fork..."/") #创建新的会话,子进程成为会话的首进程 os.setsid() #修改工作目录的umask os.umask(0) #创建孙子进程,而后子进程退出 try: pid = os.fork...time.ctime()) fd.flush() fd.close() if __name__=='__main__': createDaemon() fork子进程,父进程退出 通常,我们执行服务端程序的时候都会通过终端连接到服务器...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。
stdout='/dev/null', stderr='/dev/null'): # 重定向标准文件描述符(默认情况下定向到/dev/null) try: pid = os.fork...() # 父进程(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。 ...# 执行第二次fork try: pid = os.fork() if pid > 0: sys.exit(0) # 第二个父进程退出...1、fork子进程,父进程退出 通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端盒shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。
而对于init进程,它是一个由内核在引导装入时启动的用户层次的命令,属于用户级守护进程,主要负责启动各运行层次特定系统服务。这些服务通常是在它们自己拥有的守护进程的帮助下实现的。...7、忽略SIGCHLD信号 这一步并非必须的,只对需要创建子进程的守护进程才有必要,很多服务器守护进程设计成通过派生子进程来处理客户端的请求,如果父进程不对SIGCHLD信号进行处理的话,子进程在终止后变成僵尸进程...============' #在调用daemon_init函数前是可以使用print到标准输出的,调用之后就要用把提示信息通过stdout发送到日志系统中了 daemon_init('/dev/...() #父进程(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。...python的输出有缓冲,导致ser_log.out并不能够马上看到输出。
然而,在实际应用中,孤儿进程虽然不会给系统造成直接性的危害,但更多时候会对业务造成一些影响,如当子进程为一个基于tcp的socket服务时,会造成主进程再次启动时无法启动,端口被占用。...对于一些有进程监控的服务来说,可能会造成业务主服务无法重启,或是进程不可控。 鉴于这些情况下,很多时候是不希望产生孤儿进程的,子进程应随父进程结束而结束。...为什么 豆瓣工程师给出了解决办法,不能只拿来用用,得问几个为什么?通过什么实现的?为什么要这么做呢? 下面具体分析下实现方法: 1....() if pid == 0: # child process os.setpgrp() pid = os.fork() if pid...子进程在exit_when_parent_or_child_dies方法中循环等待父进程状态,当PPID为1时,说明父进程已退出,通过killpg()将进程组中的所有进程(孙孙进程)杀死,然后自己退出。
为什么要realase发布而不用debug直接部署?这背后的性能相差几何?...小潘同学最爱打扫 postion_index:25 postion_index:0 其他方法可以参考:这篇文章(Python3很多都和Python2不太相同,辩证去看吧) 注意一点: 通过MMap内存映射之后...、忽略和阻塞的(这个是系统预留的,如果连预留都没有可以想象肯定木马横向) PS:信号的优先级一般都是比较高的,往往进程收到信号后都会停下手上的事情先处理信号(死循环也一样歇菜) 来看一个例子:(处理singint...我这边只是一台老电脑,要是真在服务器下性能相差可能让你吓一跳 现在知道为什么要realase发布而不用debug直接部署了吧(线上项目非必要情况,一般都会删除所有日记输出的) 定时器setitimer(...sys.stdout.fileno()) with open("err.log", "a+") as f: os.dup2(f.fileno(), sys.stderr.fileno()) 之后你
博客:http://blog.tangyingkang.com/ ❈— Daemon场景 考虑如下场景:你编写了一个python服务程序,并且在命令行下启动,而你的命令行会话又被终端所控制...,python服务成了终端程序的一个子进程。...要使你的python服务不受终端影响而常驻系统,就需要将它变成守护进程。...因为子进程现在是会话组长了(对话期的首次进程),有能力打开控制终端,再fork一次,孙子进程就不能打开控制终端了。...因此,上面代码中,子进程可以调用setsid(),而父进程不能,因为它本身就是会话组长。
我们知道进程是python中最小的资源分配单元,也就是进程中间的数据,内存是不共享的,每启动一个进程,都要独立分配资源和拷贝访问的数据,所以进程的启动和销毁的代价是比较大了,所以在实际中使用多进程,要根据服务器的配置来设定...,这是多进程在使用中与多线程最明显的区别。...结束测试 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。...适用系统:unix forkserver 当程序启动并选择forkserver的启动方法时,将启动服务器进程。...从那时起,每当需要一个新进程时,父进程就会连接到服务器,并请求它fork一个新进程。 fork server进程是单线程的,所以使用os.fork()是安全的。
首先,为什么不用注册中心呢? 要做到分布式环境下的高可用,肯定是需要服务注册、服务发现这样的概念的。没有外部注册中心,说白了就是自己去实现了一套类似的机制。那为什么要怎么做呢?...server 既然需要持有某一个分组下完整的集群信息,那么可以顺其自然的想到,能不能让某一个分组的所有 worker 都连接到某一台 server 呢?...重连?这一连串词汇,把我拉回了刚刚设计的方案之中,然后给我当头一棒。...就像前面说的那样,worker 因为没办法获取 server 的准确状态,所以不能由 worker 来决定连接哪一台 server。因此,worker 需要做的,只是服务发现。...我们的目标是某个分组下所有的 worker 都连接到同一台 server,因此,即便产生那种误打误撞篡位的情况,在服务发现机制的加持下,整个集群最终还是会连接到同一台 server,完美实现我们的需求。
他们常常在系统引导装入时启动,在系统关闭时终止。unix系统有很多守护进程,大多数服务器都是用守护进程实现的,例如inetd守护进程。...创建子-孙进程,使sid不等pid 关闭打开的文件描述符 通常就关闭STDIN、STDOUT和STDERR 改变当前工作目录 防止占用别的路径的working dir的fd,导致一些block不能...第一次fork,setsid之后,子进程成为session leader,进程可以打开终端;第二次fork产生的进程,不再是session leader,进程则无法打开终端。...') # First fork (detaches from parent) try: if os.fork() > 0:...也可以使用 Supervisor 管理进程,具体可看 Supervisor安装与配置 参考 tzuryby/daemon.py python2实现的通用的python daemon类 12.14 在Unix
一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。...为什么有的时候刷新页面不需要重新建立 SSL 连接? 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?...至于标准为什么这么设定,我们可以大概推测一个原因:由于 HTTP/1.1 是个文本协议,同时返回的内容也并不能区分对应于哪个发送的请求,所以顺序必须维持一致。...主要有下面两点: 维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。 和服务器建立多个 TCP 连接。 第四个问题:为什么有的时候刷新页面不需要重新建立 SSL 连接?...如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。
一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。...4、为什么有的时候刷新页面不需要重新建立 SSL 连接? 5、浏览器对同一 Host 建立 TCP 连接到数量有没有限制?...至于标准为什么这么设定,我们可以大概推测一个原因:由于 HTTP/1.1 是个文本协议,同时返回的内容也并不能区分对应于哪个发送的请求,所以顺序必须维持一致。...主要有下面两点: 1、维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。 2、和服务器建立多个 TCP 连接。 第四个问题: 为什么有的时候刷新页面不需要重新建立 SSL 连接?...如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。
为什么有的时候刷新页面不需要重新建立 SSL 连接? 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?...至于标准为什么这么设定,我们可以大概推测一个原因:由于 HTTP/1.1 是个文本协议,同时返回的内容也并不能区分对应于哪个发送的请求,所以顺序必须维持一致。...Head-of-line Blocking 连接头阻塞:在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。...主要有下面两点: 维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。 和服务器建立多个 TCP 连接。 第四个问题 为什么有的时候刷新页面不需要重新建立 SSL 连接?...如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。
为什么有的时候刷新页面不需要重新建立 SSL 连接? 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?...至于标准为什么这么设定,我们可以大概推测一个原因: 由于 HTTP/1.1 是个文本协议,同时返回的内容也并不能区分对应于哪个发送的请求,所以顺序必须维持一致。...Head-of-line Blocking 连接头阻塞:在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求,按照标准,服务器应该按照收到请求的顺序返回结果 假设服务器在处理首个请求时花费了大量时间...主要有下面两点: 维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。 和服务器建立多个 TCP 连接。 第四个问题 为什么有的时候刷新页面不需要重新建立 SSL 连接?...如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2 如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。
为什么有的时候刷新页面不需要重新建立 SSL 连接? 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?...至于标准为什么这么设定,我们可以大概推测一个原因:由于 HTTP/1.1 是个文本协议,同时返回的内容也并不能区分对应于哪个发送的请求,所以顺序必须维持一致。...Head-of-line Blocking 连接头阻塞:在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。...主要有下面两点: 维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。 和服务器建立多个 TCP 连接。 4.第四个问题 为什么有的时候刷新页面不需要重新建立 SSL 连接?...如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。
领取专属 10元无门槛券
手把手带您无忧上云