董俊俊 的个人动态
  • 董俊俊 发布了文章
    2个月前

    Python高阶函数 - 装饰器 decorator

    由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。>>> def now():... print('2015-3-25')...>&gt
  • 董俊俊 发布了文章
    2个月前

    7年编程的心得感悟,这么是多么痛的领悟

    我的大学是个二本(吉首大学,你肯定没听说过),大学专业是电子信息工程,入学没多久,我就感觉我完全报错专业了,因为我对硬件毫无兴趣,我从大学一年级开始学习编程,我记得最初的课本是谭浩强老师的《c 语言程
  • 董俊俊 发布了文章
    2个月前

    Python函数作为返回值 - 闭包 Closure

    函数作为返回值高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:def calc_sum(*args): ax =
  • 董俊俊 发布了文章
    2个月前

    Python高阶函数 - sorted排序

    排序算法排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个 dict 呢?直接比较数学上的大小是没有意义
  • 董俊俊 回答了问题
    2个月前

    mysql统计订单表每天、每月、每年的数据

    你这么说真的很为难,不过也不是不可以,你先生成对应日期的虚拟表,然后依据这个虚拟表中的日期,进行 where 条件查询。

    嗯,就是这么简单,应该要写个存储过程吧,因为在存储过程外是不允许循环的。

    当然了,并不建议你这么做,因为很容易全表查询。

    建议,统计好对应数据再交由程序进行遍历,如果空缺,默认设置显示当天为空就好。

  • 董俊俊 提出了问题
    2个月前
  • 董俊俊 回答了问题
    2个月前

    nodejs 多页面开发 如何提高编译速度

    ...32核的CPU???你用E7编程吗?
    好吧可能是我见识少.我感觉你插个PCIE通道的SSD会好点.比如960pro
    不过.我怎么感觉都是你配置文件没写对....

  • 董俊俊 提出了问题
    2个月前
  • 董俊俊 回答了问题
    2个月前

    循环引用的python程序中,如何释放掉内存。

    这种递归方式,内存没占满也是会栈溢出的。递归过程中,上一层的函数实际并没有运行完,因此也别指望垃圾回收过来清理。强烈建议改程序,可以类似这样:

    while True:
        a()
        b()
  • 董俊俊 回答了问题
    2个月前

    php://input在表单POST是否无效?

    php://input 可以接受所有 body 内容。
    但是遗憾的是:
    enctype="multipart/form-data" 时 php://input 无效

    参见官方文档

    php://input is not available with enctype="multipart/form-data".

    大意:enctype="multipart/form-data" 的时候 php://input 是无效的。

    哎。我以前也写php,但后来发现他是一个难接触到更深层次东西的语言。这不符合我的性格,所以我放弃了。php在io方面的能力。真的是。。。哎。

    还是老老实实地用 file_upload 之类的函数吧。虽然很低效,但是又能怎么样呢?

    祝你好运。

  • 董俊俊 提出了问题
    2个月前
  • 董俊俊 回答了问题
    2个月前

    Nginx内部有使用多线程吗?

    cat /proc/3776/status|grep Threads 可见Nginx工作进程只有1个线程,其中3776是Nginx工作进程的PID。另外Nginx从1.7.11加入了AIO线程池支持,能够使用AIO多线程读取和发送大文件,以免工人进程被阻塞(小文件用sendfile,大文件用AIO线程池),要启用线程池支持,configure时需要显式加入--with-threads选项。
    https://www.nginx.com/blog/thread-pools-boost-performance-9x/
    http://nginx.org/en/docs/ngx_core_module.html#thread_pool

    转:
    当listen_fd有新的accept()请求过来,操作系统会唤醒所有子进程,因为这些进程都epoll_wait()同一个listen_fd,操作系统又无从判断由谁来负责accept,索性干脆全部叫醒,但最终只会有一个进程成功accept,其他进程accept失败.所有子进程都是被"吓醒"的,所以称之为Thundering Herd(惊群).

    监听套接字在启动时就完成初始化,worker进程通过这些套接字接受,读取请求和输出响应.Nginx并没有像PHP-FPM那样采用master进程来分发请求,这个工作由操作系统内核机制完成,所以可能会导致惊群现象,也就是当listen_fd有新的accept()请求过来,操作系统会唤醒所有子进程.

    Nginx解决惊群的思路:避免惊群.
    http://nginx.org/en/docs/ngx_core_module.html#accept_mutex
    具体措施有使用全局互斥锁(accept_mutex on),每个工作进程在epoll_wait()之前先去申请锁,申请到则继续处理,获取不到则等待,并设置了一个负载均衡的算法(当某一个工作进程的任务量达到总设置量的7/8时,则不会再尝试去申请锁)来均衡各个进程的任务量.

    Nginx解决惊群的新方法:使用内核提供的Socket ReusePort功能
    NGINX 1.9.1 支持socket分片:
    http://nglua.com/docs/sharding.html
    NGINX1.9.1支持socket的SO_REUSEPORT选项,这个选项在许多操作系统的新版本有效,包括DragonFly BSD和Linux(3.9+内核).这个选项允许多个socket监听同一个IP地址和端口的组合.内核负载均衡这些进来的sockets连接,将这些socket有效的分片.当SO_REUSEPORT选项没开启时,连接进来时监听socket默认会通知某个进程.如果accept_mutex off这个指令,此时会唤醒所有的工作进程,它们将为了得到它产生竞争,这就是所谓的惊群现象.如果使用epoll且不用锁(accept_mutex off),当监听端口有读操作时,是会产生惊群现象的.启用SO_REUSEPORT选项后,每个进程都有自己独立的监听socket.内核决定哪个是有效的socket(进程)得到这个连接.这样做降低了延迟并提高了工作进程的性能,它也意味着工作进程在准备处理它们前被赋予了新的连接.

    nginx默认以多进程的方式工作,一个master进程和多个worker进程,master进程主要用来管理worker进程.多个worker进程同等竞争来自客户端的请求,一个worker进程可以处理多个请求,但不能处理其它worker进程的请求.每个worker进程里面只有一个主线程,在epoll支持下,采用异步非阻塞的方式来处理请求,从而实现高并发.epoll支持监听多个事件(socket轮询),当事件没准备好时,放到epoll里面,事件准备好了,就去读写.与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级.并发数再多也不会导致无谓的资源浪费(上下文切换),更多的并发数,只是会占用更多的内存而已.而httpd常用的工作方式是每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了,这对操作系统来说,是个不小的挑战.线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,httpd的性能自然就上不去了.Tengine团队之前有对连接数进行过测试,在24G内存的机器上,Nginx处理的并发请求数达到过200万.(平均1G内存可以处理8万多请求)Nginx支持将某一个进程绑定在某一个核上(CPU亲缘性绑定),这样就不会因为进程的切换带来cache的失效,所以推荐设置cpu有几个核就设置几个worker进程.但注意,过多的worker进程,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换,所以worker进程不是越多越好.详细参见:
    http://tengine.taobao.org/book/chapter_02.html

  • 董俊俊 回答了问题
    2个月前

    phper整天CURD,Laravel如何支撑高并发???

    千万不要这样认为。要搞清楚为什么要用框架?框架可不是随便出现的,它是解决问题的。
    下面的概念请认真理解清楚。

    • “设计模式 < 框架 < 架构 < 平台”: 从复用角度讲,设计模式是代码级复用、框架是模块级复用、架构是系统级复用、平台是企业应用级复用。
    • 模式:即 pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。大型程序使用
    • 框架:即 framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
    • 架构:从大的层面来说,比如针对公司业务的 B2C 网站系统架构,里面可能会用到多种解决各方面问题的框架,关注的是技术整合、扩展、可维护性。换个角度,在框架中也会涉及到架构问题,比如开发 NHibernate 框架,也需要考虑如何进行设计。
    • 平台:平台的概念类似框架,但又结合的架构的考虑,它是更高层面上的 “框架”,准确说是一种应用。它是针对企业用户,为解决企业业务需要而形成的产品。

    怎么更具体的理解呢?

    • 类库是工具箱
    • 框架 —— 一套通用解决方案 —— 是书柜架子,可以装门,抽屉通用解决方案,针对不同场景使用。不好跨越(书架不可以睡人),更换框架就像换书架一样,迁移原有物品
    • 架构 —— 高度抽象需求 ———— 就是房子的房型图,房间怎么用怎么装修,但是承重墙不能动,80 平不会多,人多就住不下
    • 平台 —— 所有可能事情集合 ———— 相当于小区,有所限制,有所提供服务

    实用来说,平台没啥好选,没多少可选。架构考验人,设计不好就被虐,框架看团队偏好,一般选择熟悉的。库自己选顺手的即可

    “laravel 注重的优雅的写代码,相对 java 之类的性能太弱了” ---- 你应该佩服 laravel 作者,为什么设计这么好用的框架。设计出一个这么好的舞台,表演如何,就看你演技是否高超了。

  • 董俊俊 回答了问题
    2个月前

    mysql是否该使用外键约束???

    是否使用外键确实会有一些争议。

    关于外键的使用:

    首页,外键本身是为了实现强一致性,所以如果需要正确性 > 性能的话,还是建议使用外键,
    它可以让我们在数据库的层面保证数据的完整性和一致性。

    当然不用外键,你也可以在业务层进行实现。
    不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。
    也就是说业务逻辑和数据必须同时修改。
    而且在工作中,业务逻辑是会经常发生变化的。

     

  • 董俊俊 提出了问题
    2个月前
  • 董俊俊 发布了文章
    2个月前

    程序员如何用8小时之外赚钱?

    程序员8小时以外的挣钱路子&hellip;&hellip;&nbsp;在这个和谐的社会也需要钱;还要找女朋友、房子、车&hellip;等等&nbsp;,然后想想自己的月薪,慢慢赞吧&hellip;&h
  • 董俊俊 发布了文章
    2个月前

    程序员为什么不单干、接私活、自己开公司

    此篇文章来源于知友的提问「为什么程序员不单干,自己写程序卖啊啥的&hellip;&hellip;而要去公司上班领死工资?」这对于在校的和刚工作不久的程序员来说是一个非常好的问题,甚至我相信不少人自己也
  • 董俊俊 发布了文章
    2个月前

    卧槽,写代码真赚钱

    每个人大学的时候都曾有个梦想:脱离父母的管束,获得自由。然而每个月还是要从他们那里拿生活费。所以在大学时代时代实现经济自由就成了实现梦想的必经之路。你看,我就是那众多的人之一。然而我并不是因为想获得自
  • 董俊俊 发布了文章
    2个月前

    python中不按顺序传递默认参数与php的不同

    今天看到python的函数部分,发现python的函数有一个很实用的特性:支持函数调用方不按顺序提供部分默认参数。一般的带可选参数的函数和调用如下:def power(x, n=2): if n
最近访客
  • 小花花
    小花花 4周前