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)
某个系统支持两个或多个动作同时执行,那么这个系统是并行系统
并行概念是并发的一个子集,当编写的一个拥有多线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行的方法来运行代码;
2、threading模块
2.1 通过传入函数来创建线程
t = threading.Thread(target=sing, name=”sing”):返回的是一个Thread对象,即实例化Thread类;
参数target(任务):接收一个可调用对象(函数),即这个线程的功能;
参数name:线程的名称;
t.start():创建并开启一个线程;
举例:
import threading
import time
def sing():
for i in range(5):
print("sing now---")
time.sleep(0.5)
def dance():
for i in range(5):
print("dance now---")
time.sleep(0.5)
def main():
sing_thread = threading.Thread(target=sing, name="sing")
dance_thread = threading.Thread(target=dance, name='dance')
sing_thread.start()
dance_thread.start()
if __name__ == '__main__':
main()
2.2 通过继承threading.Thread这个类来创建一个线程
一定要重写run方法,否则start()方法无法开启进程,一般在run方法中定义线程的功能;
有多少个功能则定义多少个类
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name=''):
super().__init__()
self.name = name
def run(self):
print("开始线程%s---" % self.name)
for i in range(5):
print("sing now---%s " % self.name)
time.sleep(0.5)
print("结束线程%s---" % self.name)
if __name__ == '__main__':
mythread1 = MyThread(name='thread1')
mythread2 = MyThread(name='thread2')
mythread1.start()
mythread2.start()