1、相关概念

1.1线程(thread)

线程是CPU调度和分派的最小基本单位;被包含在进程中;线程可与同属一个进程的其他的线程共享进程所拥有的全部资源;

1.2进程(process)

进程是资源分配和调度的基本单位,一个进程可以包含多个线程;
程序并不能单独执行,只有将程序加载到内存中,系统为他分配资源后才能够执行,这种执行的程序称之为进程,也就是说进程是系统进行资源分配和调度的一个独立单位,每个进程都有自己单独的地址空间。所以说程序与进程的区别在于,程序是指令的集合,是进程运行的静态描述文本,而进程则是程序在系统上顺序执行时的动态活动。
参考文章https://blog.csdn.net/woaigaolaoshi/article/details/51039505

1.3并发(concurrence)

某个系统支持两个或多个动作同时存在,那么这个系统就是并发系统;

在并发程序中可以同时拥有两个或者多个线程,这意味着当程序在单核处理器上运行时,那么这两个线程将交替地换入或者换出内存,这些线程是同时存在的—-每个线程都是处于执行过程中的某一个状态;如果程序可以并行执行,那么就一定是运行在多核处理器上,此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行;
并发在某一时刻执行的只有一个任务,因为CPU执行的速度实在是太快了,所以我们看起来就像是几个任务同时执行了一样;其原理是CPU执行时当遇到延迟的时候,CPU会执行另一准备好的任务,之后再回来执行之前延迟未完成的任务;当有多个任务都已经准备好了的时候,就是抢占CPU了,看谁先抢到就先执行谁

CPU数小于当前要执行任务
并发是假的多任务;

1.4并行(parallel)

某个系统支持两个或多个动作同时执行,那么这个系统是并行系统

并行概念是并发的一个子集,当编写的一个拥有多线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行的方法来运行代码;

CPU大于当前要执行的任务;
并行是真的多任务;
**

2、threading模块

2.1 通过传入函数来创建线程

t = threading.Thread(target=sing, name=”sing”):返回的是一个Thread对象,即实例化Thread类;
参数target(任务):接收一个可调用对象(函数),即这个线程的功能;
参数name:线程的名称;
t.start():创建并开启一个线程;

举例:

  1. import threading
  2. import time
  3. def sing():
  4. for i in range(5):
  5. print("sing now---")
  6. time.sleep(0.5)
  7. def dance():
  8. for i in range(5):
  9. print("dance now---")
  10. time.sleep(0.5)
  11. def main():
  12. sing_thread = threading.Thread(target=sing, name="sing")
  13. dance_thread = threading.Thread(target=dance, name='dance')
  14. sing_thread.start()
  15. dance_thread.start()
  16. if __name__ == '__main__':
  17. main()

2.2 通过继承threading.Thread这个类来创建一个线程

一定要重写run方法,否则start()方法无法开启进程,一般在run方法中定义线程的功能;
有多少个功能则定义多少个类

  1. import threading
  2. import time
  3. class MyThread(threading.Thread):
  4. def __init__(self, name=''):
  5. super().__init__()
  6. self.name = name
  7. def run(self):
  8. print("开始线程%s---" % self.name)
  9. for i in range(5):
  10. print("sing now---%s " % self.name)
  11. time.sleep(0.5)
  12. print("结束线程%s---" % self.name)
  13. if __name__ == '__main__':
  14. mythread1 = MyThread(name='thread1')
  15. mythread2 = MyThread(name='thread2')
  16. mythread1.start()
  17. mythread2.start()