并行&并发
- CPU的核心数 >= 任务数量,称之为并行
- 任务数量 > CPU核心数,称之为并行
- 并行是真的多任务,并发是“假的多任务”
threading模块
Thread类(线程)
- 启动线程_示例
import threading
import time
def hello():
for i in range(3):
print('hello world...')
time.sleep(2)
if __name__ == '__main__':
test = threading.Thread(target=hello) #这里写调用函数的函数名
test.start() # 启动线程,由主线程启动的新线程,我们可以称之为子线程
print('hello...')
- 最开始执行程序的线程,我们称之为主线程
- 由主线程启动的新线程,我们可以称之为子线程
- 注意:
Thread(target=函数名)
,不是函数 - 如果主线程下面已经没有代码了,那么它会等待其他的子线程执行完毕再结束程序
- 更多参考文章
查看线程数量
threading.enumerate()
查看程序当前正在运行的线程,返回一个包含包括主线程在内的所有线程的列表
线程执行代码的封装
- 定义一个类继承threading的Thread类,把要执行的关联性任务放到这个类当中,从而实现使用一个线程来执行这些任务
import threading
import time
class MyThread(threading.Thread):
def run(self):
for i in range(3):
time.sleep(1)
msg = "I'm " + self.name + " @ " + str(i) # name属性中保存的是当前线程的名字
print(msg)
if __name__ == '__main__':
test = MyThread()
test.start() # 启动线程
- 注意:这里是使用
start()
启动线程而非调用run()
方法,因为start()
方法会自动调用·run()
方法 start()
会执行自定义类中的run()
方法,注意:函数名一定要是run
!!!
多线程-全局变量
- 在一个函数中 ,对全局变量进行修改的时候,到底是否需要使用global进行说明?要看是否对 全局变量 的指向进行了修改,如果修改了指向:即让全局变量指向了一个新的地方,那么必须使用global;如果,仅仅是修改了 指向的空间中的数据,此时不用必须使用global
- 注意:多线程中全局变量是共享的(各个线程共享全局变量)
来源:CSDN
作者:xiaoqiangclub
链接:https://blog.csdn.net/xiaoqiangclub/article/details/104537345