并发编程

多道分时技术

多道技术就是允许多个程序同时进入内存并运行,交叉使用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)	

posted @ 2019-10-22 00:13  YajunRan  阅读(113)  评论(0编辑  收藏  举报