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

Posted zach0812

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多任务--进程 及 进程间通信相关的知识,希望对你有一定的参考价值。

程序和进程的区别:

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

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

 

多任务-进程的初体验:

技术图片
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

 

以上是关于多任务--进程 及 进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

多线程 及 分布式进程间的通信

进程间通信方式及特点

线程间通信的定义及全局变量的方法

python进阶多进程(进程池,进程间通信)

VC++ 进程间的通信

谈谈Mac进程间通信--XPC