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

  • 相关阅读:
    Entity SQL 初入
    ObjectQuery查询及方法
    Entity Framework 的事务 DbTransaction
    Construct Binary Tree from Preorder and Inorder Traversal
    Reverse Linked List
    Best Time to Buy and Sell Stock
    Remove Duplicates from Sorted Array II
    Reverse Integer
    Implement Stack using Queues
    C++中const限定符的应用
  • 原文地址:https://www.cnblogs.com/zach0812/p/11413740.html
Copyright © 2011-2022 走看看