Python3 学习笔记---线程、进程、协程

一、线程

from threading import Thread #线程类 # 多线程方式一 def fn(name): for i in range(10): print('线程{}'.format(name),i) if __name__ == '__main__': t = Thread(target=fn,args=("jj",)) # target 指定任务名称, args:传入参数,必须为数组类型,后边的逗号不能缺 t.start() #指定多线程状态为可执行状态,具体执行时间又CPU决定 for i in range(20): print('main',i) #多线程方式二 class myThread(Thread): def run(self): for i in range(10): print('子线程',i) if __name__ == '__main__': t = myThread() t.start() #千万不要t.run() --》方法调用,单线程 for i in range(10): print('main',i) # 线程池 from concurrent.futures import ThreadPoolExecutor #线程池

def fn1(name): #创建一个需要执行的任务,name:可传入参数 for i in range(10): print(name,i) if __name__ == '__main__': with ThreadPoolExecutor(3) as t: #创建一个有3个线程的线程池 for i in range(20): #有20个任务 t.submit(fn1, name = '线程{}'.format(i)) #将任务逐个提交到线程池 print("Over !!!") #等待线程池执行完成之后,才继续执行(守护)

 

二、进程

from multiprocessing import Process #进程 #进程方法一 def fn(name): for i in range(10): print('子进程{}'.format(name),i) if __name__ == '__main__': p = Process(target=fn,args=('jj',)) p.start() p.join() for i in range(10): print('主进程',i) #进程方法二 class myProcess(Process): def run(self): for i in range(10): print('子进程',i) if __name__ == '__main__': p = myProcess() p.start() for i in range(10): print('主进程',i) #进程池 from concurrent.futures import ProcessPoolExecutor #进程池

def fn(name,name1): for i in range(10): print('子进程{}'.format(name),i,name1) if __name__ == '__main__': with ProcessPoolExecutor(max_workers=10) as p: for i in range(20): p.submit(fn,name=i,name1='b') #传递参数 print("Over !!!") #等待进程池执行完成之后,才继续执行(守护)

 

 

三、协程

介绍:为了保证CPU一直处理想要处理的程序,而不是去处理和程序无关的其他事务。

import asyncio import time async def func1(): #函数前加 async 切换为异步函数 print("hello 11") await asyncio.sleep(3) #异步操作的代码在此处。 比如:requests.get() await:表示后台挂起,释放CPU print("hello 11") async def func2(): print("hello 22") await asyncio.sleep(2) print("hello 22") async def func3(): print("hello 33") await asyncio.sleep(4) print("hello 33") async def main(): # tasks = [func1(),func2(),func3()] #func1() 此时的函数是异步协程函数,函数执行得到的是一个协程对象 # await asyncio.wait(tasks) # # #在python 3.8 以后的版本 使用以上方式会报错,推荐直接使用以下方式,代码如下 tasks = [ asyncio.create_task(func1()), asyncio.create_task(func2()), asyncio.create_task(func3()) ] await asyncio.wait(tasks) #必须使用await 挂起任务,否则报错 if __name__ == '__main__': t1 = time.time() asyncio.run(main()) #协程程序运行需要 asyncio模块支持, 此处为执行任务列表的固定搭配 t2 = time.time() print(t2 - t1) #如果串行了至少需要9秒, 通过协程处理后只需要4秒多。

 


__EOF__

本文作者语 默
本文链接https://www.cnblogs.com/weijie0717/p/15787461.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   语~默  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示