1.并发和并行
并发:在逻辑上具备同时处理多个任务的能力(其实每时刻只有一个任务)
并行:物理上在同一时刻执行多个并发任务
2.线程与进程
一个进程管多个线程,一个进程至少有一个线程
python多线程是假的,因为python解释器内置同一时间CPU只运行一个线程
import threading
import time
def foo(something):
for i in range(10):
print(something)
time.sleep(1)
#创建线程
t1=threading.Thread(target=foo,args=("看电影",))
t2=threading.Thread(target=foo,args=("听音乐",))
#启动线程
t1.start()
t2.start()
3.join函数-阻塞主线程
一个主线程,2个子线程t1和t2
需要t1和t2运行结束之前,数据检查不会运行,也就是把主线程阻塞
import threading
import time
def foo(something):
for i in range(10):
print(something)
time.sleep(1)
#创建线程
t1=threading.Thread(target=foo,args=("数据逻辑1",))
t2=threading.Thread(target=foo,args=("数据逻辑2",))
#启动线程
t1.start()
t2.start()
#join在子线程完成运行之前,这个子线程的父线程将一直被阻塞
t1.join()
t2.join()
print("启动数据检查....")
4.守护线程
消费需求满足后,数据逻辑1和2不需要再运行了,直接退出主线程
如果没有声明守护线程,主线程就要等子线程全部执行完才退出
import threading
import time
def foo(something):
for i in range(10):
print(something)
time.sleep(1)
#创建线程
t1=threading.Thread(target=foo,args=("数据逻辑1",))
t2=threading.Thread(target=foo,args=("数据逻辑2",))
#声明守护线程,必须再start方法之前,声明守护线程
t1.setDaemon(True)
t2.setDaemon(True)
#启动线程
t1.start()
t2.start()
for i in range(10):
print("消费数据....")
time.sleep(1)
print("消费需求已经满足了")