zoukankan      html  css  js  c++  java
  • 多任务--进程 及 进程间通信

    进程三状态:

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

    程序和进程的区别:

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

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

    多任务-进程的初体验:

    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

  • 相关阅读:
    C语言基本快速入门教程
    几何深度学习前沿
    Anaconda 更改清华源
    大学安全教育-实验室安全测试题库
    《如何写好科研论文》(清华)慕课答案
    集群考试试卷
    集群考试相关
    Linux下tar压缩解压用法
    2020-安全微课(新生入学教育)答案
    函数用法和底层分析
  • 原文地址:https://www.cnblogs.com/zach0812/p/11413740.html
Copyright © 2011-2022 走看看