1. import threading
  2. import time
  3. def task(arg):
  4. time.sleep(5)
  5. # 创建一个Thread对象(线程),并封装线程被CPU调度时应该执行的任务和相关参数。
  6. t = threading.Thread(target=task, args=('xxx',))
  7. # 线程准备就绪(等待CPU调度),代码继续向下执行。
  8. t.start()
  9. print("继续执行...") # 主线程执行完所有代码,不结束(等待子线程)

线程的常见方法

start

  • t.start(),当前线程准备就绪(等待CPU调度,具体时间是由CPU来决定)。
  1. import threading
  2. number = 0
  3. def myAdd(count):
  4. global number
  5. for i in range(count):
  6. number += 1
  7. t = threading.Thread(target=myAdd, args=(10000000,))
  8. t.start()
  9. print(number)

join

t.join(),等待当前线程的任务执行完毕后再向下继续执行。

  1. import threading
  2. number = 0
  3. def myAdd():
  4. global number
  5. for i in range(100000000):
  6. number += 1
  7. t = threading.Thread(target=myAdd)
  8. t.start()
  9. t.join() # 主线程等待中...
  10. print(number)
  1. import threading
  2. number = 0
  3. def myAdd():
  4. global number
  5. for i in range(10000000):
  6. number += 1
  7. print('myAdd over')
  8. def mySub():
  9. global number
  10. for i in range(10000000):
  11. number -= 1
  12. print('mySub over')
  13. t1 = threading.Thread(target=myAdd)
  14. t2 = threading.Thread(target=mySub)
  15. t1.start()
  16. t1.join() # t1线程执行完毕,才继续往后走
  17. print(666)
  18. t2.start()
  19. t2.join() # t2线程执行完毕,才继续往后走
  20. print(number)
  21. '''
  22. myAdd over
  23. 666
  24. mySub over
  25. 0
  26. '''
  1. import threading
  2. count = 10000000
  3. number = 0
  4. def myAdd(count):
  5. global number
  6. for i in range(count):
  7. number += 1
  8. def mySub(count):
  9. global number
  10. for i in range(count):
  11. number -= 1
  12. t1 = threading.Thread(target=myAdd, args=(count,))
  13. t2 = threading.Thread(target=mySub, args=(count,))
  14. t1.start()
  15. t2.start()
  16. print(666)
  17. t1.join() # t1线程执行完毕,才继续往后走
  18. print(999)
  19. t2.join() # t2线程执行完毕,才继续往后走
  20. print(number)
  21. '''
  22. 666
  23. 999
  24. -2736356 # 每次会变
  25. '''

setDaemon

t.setDaemon(布尔值) ,守护线程(必须放在start之前)

  • t.setDaemon(True),设置为守护线程,主线程执行完毕后,子线程也自动关闭。
  • t.setDaemon(False),设置为非守护线程,主线程等待子线程,子线程执行完毕后,主线程才结束。(默认)
  1. import threading
  2. import time
  3. def task(arg):
  4. time.sleep(5)
  5. print('task')
  6. t = threading.Thread(target=task, args=(666,))
  7. t.setDaemon(True) # True/False
  8. t.start()
  9. print('END')

线程名的设置和获取

  1. import threading
  2. def task(arg):
  3. # 获取当前执行此代码的线程
  4. name = threading.current_thread().getName()
  5. print(name)
  6. for i in range(6):
  7. t = threading.Thread(target=task, args=(666,))
  8. t.setName('精易-{}'.format(i))
  9. t.start()
  10. '''输出
  11. 精易-0
  12. 精易-1
  13. 精易-2
  14. 精易-3
  15. 精易-4
  16. 精易-5
  17. '''

自定义线程类

这种语法了解就好,一般看源码可能有的大佬会写高级语法

直接将线程需要做的事写到run方法中。

  1. import threading
  2. class MyThread(threading.Thread):
  3. def run(self):
  4. print('执行此线程', self._args) # 执行此线程 (100,)
  5. t = MyThread(args=(666,))
  6. t.start()