主进程和子进程_Python - 进程-线程-协程

​并发:伪并行,遇到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): pass​if __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: xxxxx​loc = Lock()t = Thread(target=f1,args=(loc,))t.start()​

递归锁 RLock

死锁现象,内部维护了一个计数器from threading import Thread,RLockfrom multiprocessing import Process,RLock​loc = 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#进程池ProcessPoolExecutor​def 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值