描述并发和并行的概念
- 并发:当前任务数大于cpu核数,通过任务调度算法,实现多个任务一起执行(实际是快速切换执行)
- 并行:当前任务数小于cpu核数在,每个任务单独执行
同步和异步
-
异步: 多任务, 多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,存在的多条运行主线。(同一时间只能做一件事,做完了才能做下一件事情)
-
同步: 多任务, 多个任务之间执行的时候要求有先后顺序,必须一个先执行完成之后,另一个才能继续执行, 只有一个主线(可以近似的理解成同一时间有多个事情在做,但有先后)
-
阻塞:从调用者的角度出发,如果在调用的时候,被卡住,不能再继续向下运行,需要等待,就说是阻塞
-
非阻塞: 从调用者的角度出发, 如果在调用的时候,没有被卡住,能够继续向下运行,无需等待,就说是非阻塞
通过线程展示异步处理
from threading import Thread
import time
def func2(func):
"""
装饰器:计算运行时间
"""
print('运行装饰器')
def wrapper():
stime = time.time() # 获取开始运行时间
func()
etime = time.time() # 获取结束时间
print('程序运行时间{}秒'.format(etime - stime))
return wrapper
def work1():
for i in range(6):
time.sleep(1)
print('绣毯子{}次'.format(i))
def work2():
for i in range(6):
time.sleep(1)
print('浇花{}次'.format(i))
@func2
def main():
T1 = Thread(target=work1) #指定任务不能待"()"
T1.start()
T2 = Thread(target=work2)
T2.start()
if __name__ == '__main__':
main()
关于thrading模块
上面的主线程没有等待导致运行时间计算错误修改如下
from threading import Thread
import time
def func2(func):
"""
装饰器:计算运行时间
"""
print('运行装饰器')
def wrapper():
stime = time.time() # 获取开始运行时间
func()
etime = time.time() # 获取结束时间
print('程序运行时间{}秒'.format(etime - stime))
return wrapper
def work1():
for i in range(6):
time.sleep(1)
print('绣毯子{}次'.format(i))
def work2():
for i in range(6):
time.sleep(1)
print('浇花{}次'.format(i))
@func2
def main():
_T1 = Thread(target=work1) # 指定任务不能待"()"
_T1.start()
_T2 = Thread(target=work2)
_T2.start()
# 设备主线程等待子线程执行结束后再往下执行
_T1.join()
_T2.join()
print('----主线程执行mian函数执行完毕---')
if __name__ == '__main__':
main()
print('---主线程执行结束后的代码-----')
线程
1.主线程默认不会等待子线程(不会管主线程是否执行完毕)
2,多线程可以共用同一块全局变量(使用的是同一块内存),会出现资源竞争
3,python中的线程没法进行并行
线程之间啥时间进行切换:
1,io耗时操作; 网络,文件,输入,输出等操作时会进行切换
2,线程执行时间达到一定的阈值,会进行切换操作
网友评论