zoukankan      html  css  js  c++  java
  • 并发编程

    多道分时技术

    多道技术就是允许多个程序同时进入内存并运行,交叉使用CPU。

    分时技术:把处理机的运行时间分成很短的时间片,按时间片轮流分配给各个联机作业使用。若

    特点:1. 若CPU遇到IO操作,会立即将当前执行程序的CPU使用权断开

    1. 当CPU分配给程序的片使用时间结束,将当前程序的使用权断开,等待下次执行

    并发与并行

    并发:多个程序对CPU和IO的使用不停切换,像多个程序在一起运行

    并行:真正意义上的同时运行,在多核CPU下的情况下,同时执行多个程序

    进程的三种状态

    就绪,运行态,阻塞态

    同步和异步

    指的任务提交的方式,

    同步:提交下一个任务时,必须等待第一个任务执行完毕

    异步:可同时提交多个任务

    阻塞和非阻塞

    针对的是进程,当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

    https://blog.csdn.net/likunshan/article/details/82224367

    子进程和父进程关联

    1. 让父进程在子进程结束后再结束,用join
    2. 让父进程结束时,子进程也结束,用守护进程

    父进程回收子进程的两种方式:

    调用join或等待父进程正常结束

    兄弟进程控制和通信

    互斥

    互斥锁:

    from multiprocessing import Process, Lock
    import json
    
    def change_file(mutex):
        mutex.acuire()
        with open("data.txt", "r") as f:
            dic = json.load(f)
            dic.["num"] -= 1
        with open("data.txt", "w") as f:
            json.dump(dic, f)
        mutex.releas()
     if __name__ = "__main__":
        mutex = Lock()
        for i in range(20):
            p = Process(target=change_file, args=(mutex,))
            
            
        
    

    信息共享

    队列:

    from multiprocessing import Process, Queue
    import time
    # 用Queue解决生产者消费者问题
    def add_data(q):
        time.sleep(3) # 等待
        q.put(1)
    
    def get_data(q):
        print(q.get()) # 会等待队列中已存入数据后再执行
    
    if __name__ == "__main__":
        q = Queue(5)
        p1 = Process(target=add_data, args=(q,))
        p2 = Process(target=get_data, args=(q,))
        p2.start()
        p1.start()
    
    

    线程

    在支持线程的操作系统中,线程是CPU调度的基本单位,进程是资源分配单位

    线程与进程的区别

    1. 一个进程可包含多个线程
    2. 进程开启会重新分配内存资源
    3. 线程间是共享同一进程的数据资源的

    线程与主进程,兄弟线程之间的互斥操作同类似进程间的操作

    GIL全局锁

    • 本质上是一个互斥锁
    • 为了保证只有一个线程运行

    在python中计算密集型使用多进程,IO密集型使用多线程

    Gevent模块

    from gevent import monkey; monkey.patch_all()
    
    import gevent 
    import time
    
    def func():
    	print("1")
    	time.sleep(1)
    	
    def func2():
    	print("2")
    	time.sleep(2)
    	print("func 2")
    f1 = gevent.spawn(func)	
    f2 = gevent.spawn(func2)	
    
    
  • 相关阅读:
    V-Ray Material Library材质名称翻译
    3dMax常用快捷键
    3dMax笔记(韵湖)
    background-size拉伸背景图片
    CSS实现子元素水平垂直居中的6种方式
    JS简易实现“最小栈”
    JS种Array原型方法reverse的模拟实现
    JS数组去重的3种方式
    encodeURIComponent和encodeURI有什么区别
    CSS中的度量单位(px/em/rem/vm/vh/...)
  • 原文地址:https://www.cnblogs.com/YajunRan/p/11717340.html
Copyright © 2011-2022 走看看