首页 > 数据库技术 > 详细

day10--异步IO\数据库\队列\缓存

时间:2017-09-02 23:51:49      阅读:282      评论:0      收藏:0      [点我收藏+]

上节回顾:

线程  vs  进程

  https://www.cnblogs.com/alex3714/articles/5230609.html

  threading.get_ident()获取线程号

    线程:操作系统调度的最小单位;进程是一簇线程的集合,本身不能操作,进程至少包含一个线程;

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

    递归锁。

    join()是结束上一个线程,让下一个进程能够执行。等待上一个线程执行完毕。

    守护线程(slave):服务于非守护线程(master),

    queue(队列):1、解耦,使程序直接首先松耦合;2、提高处理效率;

    queue.Queue()  FIFO=first in first out

  queue.LifoQueue()   LIFO=last in first out

    PriorityQueue(maxsize=0)    优先级队列。

    python中的多线程是伪多线程,其实是CPU的上下文切换,本质是单线程。

    io 操作不占用CPU,比如从网上读取;

  计算占用CPU,如1+1占用CPU;

    Python的多线程,不适合CPU密集操作型的任务,适合io密集型的任务。

    Python的进程也是使用操作系统的原生进程。进程之间是相互独立的。进程之间的数据是独立的,不能共享,进程也能解决操作系统多核的使用。

    进程在python模块是multiprocessing,下面来生成一个进程实例:

import multiprocessing
import time


def f(name):
    time.sleep(2)
    print(hello, name)


if __name__ == __main__:
    p = multiprocessing.Process(target=f, args=(bob,))     #生成一个线程实例
    p.start()
    p.join()    

    上面代码生成了一个进程,可以看出,进程与线程的语法几乎一样。

    启用多个进程:

import multiprocessing
import time


def f(name):
    time.sleep(1)
    print(hello, name)


if __name__ == __main__:
    for i in range(10):
        p = multiprocessing.Process(target=f, args=(bob,))     #生成一个线程实例
        p.start()
        # p.join()     

    运行结果如下:

hello bob
hello bob
hello bob
hello bob
hello bob
hello bob
hello bob
hello bob
hello bob
hello bob

    每一个进程都是由父进程启动的。

from multiprocessing import Process
import os


def info(title):
    print(title)
    print(module name:, __name__)
    print(parent process:, os.getppid())     #父进程的ID,每一个进程都是由父进程启动的
    print(process id:, os.getpid())          #子进程ID
    print("\n\n")


def f(name):
    info(\033[31;1mcalled from child process function f\033[0m)
    print(hello, name)


if __name__ == __main__:
    info(\033[32;1mmain process line\033[0m)
    p = Process(target=f, args=(bob,))
    p.start()
    p.join()

    从上面代码可以看出,任何一个进程都是有父进程启动的。Linux里面有一个超级父进程。

    进程间通讯

    不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:   

    Queues

    使用方法跟threading里的queue差不多

    两个进程之间的内存是独立的。q=queue.Queue()是线程queue,from multiprocessing import Queue是进程Queue。

from multiprocessing import Process, Queue
import os

def func():
    print("线程名字:",__name__)
    print("父线程:",os.getppid())
    print("当前进程:",os.getpid())

def f(q):
    q.put([42, None, hello])


if __name__ == __main__:
    q = Queue()                         #进程queue
    func()
    p = Process(target=f, args=(q,))    #子进程的,是不能访问父进程的内存的
    p.start()
    print(q.get())  # prints "[42, None, ‘hello‘]"
    p.join()
运行结果如下:
线程名字: __main__
父线程: 2561
当前进程: 32596
[42, None, ‘hello‘]

    进程Queue是两个Queue,不是共享Queue,是通过pickle进行转换,克隆一份,让进程看起来实现了相互通信。

day10--异步IO\数据库\队列\缓存

原文:http://www.cnblogs.com/gengcx/p/7468266.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!