返回顶部

多任务--进程 及 进程间通信

进程三状态:

就绪状态   和  运行   和 阻塞 三个状态。  

 

 

 

 

程序和进程的区别:

程序只有一份,进程可以有多个!

进程拥有资源,进程是最小的资源分配单位!

 

多任务-进程的初体验:

import time
import multiprocessing


def test01():
    while True:
        print("{:=^20}".format(1))
        time.sleep(1)

def test02():
    while True:
        print("{:=^20}".format(2))
        time.sleep(1)

if __name__ == '__main__':
    process1 = multiprocessing.Process(target=test01)
    process2 = multiprocessing.Process(target=test02)

    process1.start()
    process2.start()
View Code

 

进程和线程的对比和各自优缺点:

对比:

进程是最小的资源分配单位,线程是最终的执行单位。

线线程不能够独立执行,必须依存在进程中

 

优缺点:

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。

一般开发中,喜欢用的是多线程!

进程间通信:

其实,socket 就是一种进程间通信的方式!

通过磁盘上的文件也可以实现进程间通信!

 

下面说的是通过队列进行进程间通信

一个进程直接向内存中写数据,另一个进程从内存汇总读数据!(这种方式,既没有用网络,也没用磁盘文件

这个内存的特点是:先进先出,所以叫做通过队列完成进程间通信.

 

通过put向Queue 中放数据 ,通过get 从Queue 中读数据,

  注:当Queue 中满时,put 放不进去(阻塞),当Queue 中空时,get不出来(阻塞)

 

Queue 示意图

 

进程间通信:

import multiprocessing
import time

def download_from_web(q):
    "模拟从网上下载数据"
    data = list([11,22,33,44])

    #向队列中写入数据
    for temp in data:
        q.put(temp)
    print("{:=^20}".format("下载完成,并以放入队列中"))

def analysis_data(q):
    "模拟数据处理"
    worked_data = list()
    while True:
        print("receiving...")
        time.sleep(2)
        data = q.get()
        worked_data.append(data+1)

        print(worked_data)
        if q.empty():
            print("接受完毕")
            break
def main():
    #1,创建一个队列
    q = multiprocessing.Queue()  #max 根据硬件条件而定

    #2,将队列的引用当做实参传递到两个子进程中
    process1 = multiprocessing.Process(target=download_from_web,args=(q,))
    process2 = multiprocessing.Process(target=analysis_data,args=(q,))

    process1.start()
    process2.start()


if __name__ == '__main__':
    main()
通过Queue 实现进程间通信-初体验Demo

 

共享数据:

关于进程间共享数据

https://blog.csdn.net/houyanhua1/article/details/78244288

 

posted @ 2019-08-26 18:44  Zcb0812  阅读(440)  评论(0编辑  收藏  举报