• day10进程、异步IO、


    线程 内存共享

    线程同时修改同一份数据时必须加锁,mutex互斥锁

    递归锁

    def fun(n):

      code

    t = threading.Thread(target=run,args=(n,))

    t.start()

    t.join()#必须要等待线程执行完才能往下执行

    守护线程t.setDaemon()必须在start()上定义,主线程不必等待守护线程的结束

    io操作不占用CPU ,计算操作占用CPU

    python多线程其实是单核操作:不适合CPU密集操作型的任务,适合IO操作密集型的任务。

    进程之间互访数据multiprocessing.Process(target = f,args = (q,):

    通过multiprocessing.Queue()共享:其实是在子进程中克隆一份queue,然后通过pickle序列化实现两个queue之间的通信,该过程直接通过python底层实现,无需用户操作。

    管道:parent_conn, child_conn = multiprocessing.Pipe(); p = multiprocessing.Process(target=f,args=child_conn,)) 通过parent_conn, child_conn的send和recv来传递数据。

    以上两个都是传递数据。

    通过Manager可以实现真正的数据共享。

    进程锁

    进程池:multiprocessing.Pool()。可以定义进程池可执行进程数量。最后pool.close(); pool.join().

    协程:微线程,是一种用户态的轻量级线程,CPU根本不知道。协程拥有自己的寄存器上下文和栈。。。

    协程的好处:1、无需线程上下文切换的开销;2、无需原子操作锁定及同步的开销;方便切换控制流,简化编程模型;高并发、高扩展、低成本。 缺点:无法利用多核资源,

    需要导入gevent包,使用import greenlet:gr1 = greenlet(test1)

    论事件驱动与异步IO

    通常,我们写服务器处理模型的程序时,有以下几种模型:
    (1)每收到一个请求,创建一个新的进程,来处理该请求;
    (2)每收到一个请求,创建一个新的线程,来处理该请求;
    (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
    上面的几种方式,各有千秋,
    第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
    第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。
    第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂。
    综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式

    用户空间和内核空间

    现在操作系统都是采用虚拟存储器,那么对于32位操作系统而言,它的寻址空间为4G。操作系统的核心是内核,独立于内存的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

    http://www.cnblogs.com/alex3714/articles/5876749.html

  • 相关阅读:
    中医手诊原理
    半月痕
    0020 教您新手修车的五种实用技巧
    下面说说我开车12年来的一些心得
    创建电子邮件信纸
    交通事故责任划分2011版(图解)
    育儿语录
    汽车中控台那些按钮是什么用的?
    我的书中的部分函数
    纠结的书名
  • 原文地址:https://www.cnblogs.com/laodong1983/p/9449264.html
Copyright © 2020-2023  润新知