进程、线程、协程相关概念
进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。一个进程包含一个或多个线程,进程之间相互独立,拥有各自独立的内存空间。进程间通信需要通过特定的机制,如管道、信号、套接字等。
线程:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以有多个线程,它们共享进程的资源,如内存空间、文件句柄等。
协程:协程是一种用户态的轻量级线程实现,它不需要像线程那样创建新的进程,也被称为微线程。协程拥有自己的寄存器上下文和栈,可以用于实现多任务并发执行。
python线程
线程模块演进
python3中线程使用主要是两个模块:
1)_thread模块:
主要是提供了一些低级接口,其存在是因为python3中已经废弃了thread模块,为了兼容,python3中将thread模块重命名为_thread模块。
其创建方式为:_thread.start_new_thread(target=function_name,args=(),kwargs={})
2)threading模块:
是以thread模块为基础的封装,提供了更易用的高级接口,建议使用用此模块。
其创建方式为:t = threading.Thread(target=function_name,args=(),kwargs={})
t.start()
线程实例demo
_thread 常用方法&例子
import time
try:
import thread
except ImportError:
import _thread as thread
def print_num(thread_name, n_max):
for i in range(0, n_max):
print("子线程:%s,打印:%d" %(thread_name,i))
print("子线程结束")
if __name__ == "__main__":
n = int(input("请输入数字:"))
if n > 0:
t1 = thread.start_new_thread(print_num, ("Thread1", n,))
time.sleep(10)
else:
print("输入数字非正整数,应用退出")
print("主线程结束")
threading常用方法&例子
import threading
def print_num(n_max):
for i in range(0, n_max):
print("子线程打印:%d" % i)
print("子线程结束")
if __name__ == "__main__":
n = int(input("请输入数字:"))
if n > 0:
t = threading.Thread(target=print_num, args=(n,))
t.start()
t.join()
else:
print("输入数字非正整数,应用退出")
print("主线程结束")
运行结果:
请输入数字:10
子线程打印:0
子线程打印:1
子线程打印:2
子线程打印:3
子线程打印:4
子线程打印:5
子线程打印:6
子线程打印:7
子线程打印:8
子线程打印:9
子线程结束
主线程结束
备注:
1.线程其他常用方法:
t.join() 等待子线程结束后主线程再结束,如果不加,主线程结束后,子线程继续运行。
t.setName()
设置线程名称
t.getName()
获取线程名称
t.is_alive()
查看线程是否在生命周期
t.setDaemon(True) 设置守护线程,主线程
退出时,分支线程也退出.要在start前设置 通常不和join 一起使用
python协程
协程,简而言之就是在一个线程中通过人为创造上下文切换而实现代码块相互切换执行的一种手段。其实现的方式一般如下:
1. yield关键字
2. asyncio 模块(python3.4后支持)async/await 关键字
python协程实例demo
1. yield关键字
def print_num(n_max):
for i in range(0, n_max):
yield i
print("print_num:%d"%i)
print("结束")
if __name__ == "__main__":
n = int(input("请输入正整数:"))
for i in print_num(n):
print("主:%d"%i)
运行结果:
2. asyncio 模块+async/await
import asyncio
async def print_num(n_max):
print("开始")
# await asyncio.sleep(1)
for i in range(0, n_max):
print("print_num:%d" % i)
print("结束")
async def main():
task = asyncio.create_task(print_num(5)) #执行协程
await task #等待协程执行结束
if __name__ == "__main__":
asyncio.run(main())
print("done")
备注:async
和await
是用于编写异步代码的关键字。它们的作用是允许我们以非阻塞的方式编写并发代码,从而提高程序的性能和响应能力。关键字async
和await
只能在定义了async
函数的内部使用。如果尝试在普通函数或全局作用域中使用它们,将会引发语法错误 。