2018.10.17PYTHON26多线程课时30笔记

线程的代替方案

  • subprocess
    -完全跳过线程,使用进程
    -是派生进程的主要替代方案
    - python2.4后引入
  • mulitiprocessiong
    -使用threading的派生,使用子进程.
    - 允许为多核或者多CPU派生进程,接口跟threading非常相似
    - python2.6
  • concurrent.futures
    - 新的异步执行模块
    - 任务级别的操作
    - Python3.2后引入

多进程

  • 进程间通讯(InterprocessCommunication,IPC)
  • 进程之间无任何共享状态

案例19

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import multiprocessing
from time import sleep,ctime

def clock(interval):
    while True:
        print("我是分隔符~~~~~The time is %s"%ctime())
        sleep(interval)




if __name__== "__main__":
    p = multiprocessing.Process(target = clock,args = (6,))
    p.start()

    while True:

       sleep(1)
       print("sleep~~~~~~~~~~~~~~")

案例20

-派生子类

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import multiprocessing
from time import sleep,ctime

class ClockProcess(multiprocessing.Process):



    def __init__(self,interval):
        super().__init__()
        self.interval=interval

    def run(self):
        while True:
            print("The time is %s"%ctime())
            sleep(self.interval)


if __name__== "__main__":
    p= ClockProcess(3)
    p.start()

案例21

  • 在OS中查看PID,PPID以及他们的关系
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
from multiprocessing import Process
from time import sleep,ctime
import os


def info(tittle):
    print(tittle)
    print("moudle name:",__name__)
    print("parent process",os.getppid())
    print("process id :",os.getpid())


def f(name):
    info("function f")
    print("hello",name)

if __name__ == "__main__":
    info("main line")
    p = Process(target=f, args= ("bob",))
    p.start()
    p.join()

生产者消费者模型

joinableQueue

案例22

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import multiprocessing
from time import ctime


def consumer(input_q):
    print("Into consumer:",ctime())
    while True:
        item = input_q.get()
        if item is None:
            break
        print("pull",item,"out of q")
        input_q.task_done()
    print("Out of consumer:",ctime())

def producer(sequence,output_q):
    print("Into producer:", ctime())
    for item in sequence:
        output_q.put(item)
        print("put",item,"into q")
    print("out of procuder:",ctime())

if __name__=="__main__":
    q = multiprocessing.JoinableQueue()
    cons_p1 = multiprocessing.Process(target= consumer,args=(q,))
    
    cons_p1.start()
    cons_p2 = multiprocessing.Process(target= consumer,args=(q,))
    
    cons_p2.start()
    #生产多个项目,sequence代表要发送给消费者的项序列
    #在实践中,这可能是生成器的输出或通过一些其他方式生产出来
    sequence = [1,2,3,4]
    print(sequence,q)

    q.put(None)
    q.put(None)
    cons_p1.join()
    cons_p2.join()

猜你喜欢

转载自blog.csdn.net/weixin_42879237/article/details/83106852