【Python自学笔记】多任务,多线程,threading模块的使用

久未见 提交于 2020-02-27 19:57:18


并行&并发

  • 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
  • 注意:多线程中全局变量是共享的(各个线程共享全局变量)共享全局变量
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!