并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
变量 = threading(模块).Thread(方法)(target=函数名,没有括号,name='给线程起的名字', 传参数 少用元组args=(1,) 注意格式 多用字典kwargs={'name':'小白','age':20})
变量.start() 线程需要start
主线程等待所有子线程执行完才结束,所以有的情况需要保护主线程的执行,即以主线程为主,就算子线程没执行完,也要按照主线程的要求走,退出结束或者等等
设置保护主线程: 子线程.setDaemon(True)
线程是同时执行的,如果都用到全局变量并且对全局变量做更改,会发生资源争夺,导致数据错误,使用 子线程.join() 保证一个线程改完再执行第二个线程
或者用 锁 模块, 创建lock = threading.Lock() 上锁lock.acquire() 解锁lock.release() 注意避免死锁
自定义线程类,挺重要有容易犯错误的小点1.init方法里需要继承父类用super 2.使用run函数来执行start 3.传参易出错
一些小的点: 其实是检验的手段
print(threading.current_thread) 当前的线程
threading.enumerate() 列举活跃线程
并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
变量 = threading(模块).Thread(方法)(target=函数名,没有括号,name='给线程起的名字', 传参数 少用元组args=(1,) 注意格式 多用字典kwargs={'name':'小白','age':20})
变量.start() 线程需要start
主线程等待所有子线程执行完才结束,所以有的情况需要保护主线程的执行,即以主线程为主,就算子线程没执行完,也要按照主线程的要求走,退出结束或者等等
设置保护主线程: 子线程.setDaemon(True)
线程是同时执行的,如果都用到全局变量并且对全局变量做更改,会发生资源争夺,导致数据错误,使用 子线程.join() 保证一个线程改完再执行第二个线程
或者用 锁 模块, 创建lock = threading.Lock() 上锁lock.acquire() 解锁lock.release() 注意避免死锁
自定义线程类,挺重要有容易犯错误的小点1.init方法里需要继承父类用super 2.使用run函数来执行start 3.传参易出错
一些小的点: 其实是检验的手段
print(threading.current_thread) 当前的线程
threading.enumerate() 列举活跃线程
threading.active_count()线程活跃数量
import time
import threading
def saysorry():
print('亲爱的,我错了,可以吃饭了吗...')
time.sleep(2)
if __name__ == '__main__':
print(threading.current_thread())
for i in range(8):
# print(threading.current_thread()) # 子线程还没有start那当然还只有主线程执行
t = threading.Thread(target = saysorry) # 创建线程的格式
t.start() # 子线程要start