美文网首页
python看进程,线程,协程

python看进程,线程,协程

作者: 洛克黄瓜 | 来源:发表于2018-03-29 15:33 被阅读0次

    参考链接:https://www.jianshu.com/p/c6053a4c3dd5

    进程写(process)

    • 不共享任何状态;进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈
    • 操作系统负责调度
    • 有独立的内存空间(上下文切换的时候需要保存栈、cpu寄存器、虚拟内存、以及打开的相关句柄等信息,开销大)
    • 通讯主要通过信号传递的方式来实现(实现方式有多种,信号量、管道、事件等,通讯都需要过内核,效率低)

    线程(thread)

    • 拥有自己独立的栈和共享的堆,共享堆,不共享栈(内存角度看,堆是程序员定义的stack,栈是系统定义的)
    • 操作系统负责调度
    • 一个进程可以有多个线程,每个线程会共享父进程的资源(创建线程开销占用比进程小很多,可创建的数量也会很多)
    • 通讯除了可使用进程间通讯的方式,还可以通过共享内存的方式进行通信(通过共享内存通信比通过内核要快很多)

    协程(coroutine)

    • 协程和线程一样共享堆,不共享栈
    • 程序本身负责调度
    • 一个线程(进程)可以有多个协程,切换几乎没有开销,也不需要线程锁控制全局变量的访问

    def coroutine(func):
        def ret():
            f = func()
            f.next()
            return f
        return ret
    
    @coroutine
    def consumer():
        print "Wait to getting a task"
        while True:
            n = (yield)
            print "Got %s",n
    
    import time
    
    def producer():
        c = consumer()
        task_id = 0
        while True:
            time.sleep(1)
            print "Send a task to consumer" % task_id
            c.send("task %s" % task_id)
    
    if __name__ == "__main__":
        producer()
    

    上面这个例子中,coroutine实际上是个解释器用来自动处理生成器的预激工作。
    producer每次通过调用consumer的send函数去启动consumer,yield能够返回一个值然后卡住自己讲控制权交给主程序,主程序再去执行producer的任务。
    python常常利用yield构造生成器从而实现协程。
    python本身也有gevent,greenlet等库能够实现协程概念的操作。

    相关文章

      网友评论

          本文标题:python看进程,线程,协程

          本文链接:https://www.haomeiwen.com/subject/xqgmcftx.html