先来点基础知识。
线程
线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。
线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
为什么要使用多线程?
线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程之中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率。线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性,多个线程共享一个进程的虚拟空间。线程的共享环境包括进程代码段、进程的共有数据等,利用这些共享的数据,线程之间很容易实现通信。操作系统在创建进程时,必须为改进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能高得要多。
简单来说,使用多线程就是为了让你能够多条线路去完成一件事,这样办事效率会更快。
进程是资源单位, 每一个进程至少要有一个线程,线程是执行单位,启动每一个程序默认都会有一个主线程。
以下就是一些简单的例子,作为对线程的初步了解。
# def func():
# for i in range(1000):
# print("func", i)
#
#
# if __name__ == '__main__':
# func()
# for i in range(1000):
# print("main", i)
# 多线程
from threading import Thread # 线程类
#第一种方法:
# def func():
# for i in range(1000):
# print("func", i)
#
#
# if __name__ == '__main__':
# t = Thread(target=func) # 创建线程并给线程安排任务
# t.start() # 多线程状态为可以开始工作状态, 具体的执行时间由CPU决定
#
# for i in range(1000):
# print("main", i)
#第二种方法:
class MyThread(Thread): #继承自Thread类
def run(self): # 固定的,当线程被执行的时候, 被执行的就是run()
for i in range(1000):
print("子线程", i)
if __name__ == '__main__':
t = MyThread()
# t.run() # 如果直接用这个就是方法的调用,还是单线程
t.start() # 开启线程
for i in range(1000):
print("主线程", i)
进程
一个程序运行起来后,代码 + 所用到的资源 称之为进程,它是操作系统分配资源的基本单元。
一个静止的程序 .exe 或者 .py 不能成为进程,只有它执行起来,一旦被拿到运行内存里面去,执行代码就需要占用资源(包括网络的占用,CPU的占用,摄像头的占用,等等。。。)
线程是执行代码的东西,是依附于进程的,不仅仅通过线程完成多任务,进程也是可以的
from multiprocessing import Process
from threading import Thread
# def func():
# for i in range(1000):
# print("子进程", i)
#
#
# if __name__ == '__main__':
# p = Process(target=func)
# p.start()
# for i in range(1000):
# print("主进程", i)
def func(name):
for i in range(1000):
print(name, i)
if __name__ == '__main__':
t1 = Thread(target=func, args=("周杰伦",)) # 传递参数必须是元组
t1.start()
t2 = Thread(target=func, args=("王力宏",))
t2.start()