并发:伪并行,遇到IO,帮我们提高代码执行效率并行:真正的同时运行,多核cpu
进程:
父进程和子进程
os.getpid()当前进程的id,getppid()父进程的id
创建进程的两种方式:
方式1: from multiprocessing import Process def f(n) print(n) if __name__ == '__main__': p = Process(target=f,args=(1,)) p.daemon = True p.start() p.join() #主进程等待子进程 方式2: from multiprocessing import Process class MyProcess(Process): def __init__(self,n): self.n = n super().__init__() #这是需要执行的代码逻辑 def run(self): print(self.n) self.f2() print('xxxxxx') def f2(self): xxxx if __name__ == '__main__': p = MyProcess(20) p.start() print('主进程结束')
进程三状态:
就绪 运行 阻塞
进程间通信(IPC)
队列
from multiprocessing import Process,Queueq = Queue(3) #3个长度的队列q.put(1) #如果满了,阻塞程序q.get() #如果没了,阻塞程序q.qsize() #统计一下当前队列里面有多少个数据了q.empty() #是否为空,不可信q.full() #是否满了,不可信q.put_nowait('a') #如果满了就报错,不等待 q.get_nowait() #如果没了就报错,不等待
进程通过队列通信:
from multiprocessing import Process,Queuedef f1(q): ret = q.get() print('子进程的ret>>',ret)if __name__ == '__main__': q = Queue(3) q.put('你好') p = Process(target=f1,args=(q,)) p.start()
线程
创建线程的两种方式
方式1from threading import Threaddef f1(n): passif __name__ == '__main__': t = Thread(target=f,args=(1,)) t.daemon = True #守护线程 t.start() t.join()方式2:class MyThread(Thread): def __init(self,n): super().__init__() self.n = n def run(self): print(self.n) passif __name__ == '__main__': t = MyThread('aa') t.start()
守护线程和守护进程的区别
守护进程:随着主进程的代码执行结束,而结束守护线程:随着所有非守护线程的执行结束而结束
锁
互斥锁 Lock
作用:多线程或者多进程在操作共享数据的时候,会出现数据混乱的问题,加锁处理,牺牲了效率,保证了安全.from threading import Thread,Lockfrom multiprocessing import Process,Lockdef f1(loc): loc.acquire() xxxx loc.release() with loc: xxxxxloc = Lock()t = Thread(target=f1,args=(loc,))t.start()
递归锁 RLock
死锁现象,内部维护了一个计数器from threading import Thread,RLockfrom multiprocessing import Process,RLockloc = RLock()t = Thread(target=f1,args=(loc,))t.start()
线程队列:
import queue#先进先出的q = queue.Queue(4)...#先进后出的q = queue.LifoQueue(4)#优先级的q = queue.PriorityQueue(4)q.put((1,'xx')) #数字越小,优先级越高,越早被取出q.get() -- (1,'xx')如果优先级数字相同,后面的值类型不能不一样,而且两个字典也不能比
线程池和进程池
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor#线程池ThreadPoolExecutor#进程池ProcessPoolExecutordef f1(n,m) pass return n*n def call_back(m): m.result()--n*n print(m) #结果集对象 print(m.result())pool = ThreadPoolExecutor(max_workers=5)pool = ProcessPoolExecutor(max_workers=5)ret = pool.submit(f1,1,2)ret.result() #类似join,拿不到结果就阻塞程序pool.shutdown() #关闭池子pool.submit(f1,1,2).add_done_callback(call_back)
协程
gevent --- 基于greenlet模块
def f1(n):
pass
def f2(n):
pass
g1 = gevent.spawn(f1,1)
g2 = gevent.spawn(f2,1)
g1.join() #一个一个的join
gevent.joinall([g1,g2])
print('主任务')
![6fd9149698c1a3e704b93d8e858661d0.png](https://img-blog.csdnimg.cn/img_convert/6fd9149698c1a3e704b93d8e858661d0.png)