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


    进程三状态:

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

    程序和进程的区别:

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

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

    多任务-进程的初体验:

    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

  • 相关阅读:
    MACD各分时背离所对应的时间
    开盘低开,导致做多转负不具有可参考性
    form或input 的id和js方法名相同问题,找不到该方法。
    There is no Action mapped for namespace / and action name .
    extjs4学习-02-导入相关文件
    extjs4学习-01-准备工作
    怎么 才能显示Eclipse中Console的全部内容
    ext: gridpanel中的点击事件的参数是什么意思?
    eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法
    Navicat_Premium 连接oracle遇到ORA-28457
  • 原文地址:https://www.cnblogs.com/zach0812/p/11413740.html
Copyright © 2020-2023  润新知