1.进程
狭义上,进程是程序运行的实例。广义上,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在操作系统中,进程既是基本的分配单元,也是基本的执行单元。Python开发进程用的库比较多,如multiprocessing、subprocess、Popen等。
2.线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个进程可以有很多线程,每条线程并行执行不同的任务。
Python3 通过两个标准库 _thread 和 threading 提供对线程的支持。
- _thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。
- threading 模块除了包含 _thread 模块中的所有方法外,还提供其他方法,相对而言,在开发中这个模块用的比较多。
3. 线程创建
(1)用函数创建线程
借助线程函数用threading模块中的类Thread来创建线程。
格式:
Thread([target [, name [, args [, kwargs]]]]])
其中:
- target: 执行的目标任务名(即函数名)
- args: 以元组的方式给执行任务传递参数
- kwargs: 以字典方式给执行任务传递参数
- name: 线程名,一般不用设置
通过实际的代码来演示下如何创建创建一个线程。
import threading
def fun1(x,y):
for i in range(x,y):
print(str(i * i))
threading.Thread(target=fun1, args=(1,4)).start()
我们创建了一个名称fun1的函数,功能为:求x到y(不含y)之间的整数求其平方和,并输出结果。程序运行结果如下:
(2)使用Thread子类创建线程
import threading
class myThread(threading.Thread):
def __init__(self,x,y):
super().__init__()
self.x = x
self.y = y
def run(self):
for i in range(self.x,self.y):
print(str(i*i))
ma = myThread(0,5)
ma.start() # start()启动线程时调用myThread的run方法,
程序运行结果:
(3)线程同步
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。线程同步功能是实际开发中常用的也很重要的功能。python也提供了很多种方法保证线程的执行顺序。
我们通过其中一种方式来演示下如实控制现场同步。(join函数的方式)
import threading
class myThread(threading.Thread):
def __init__(self,x,y):
super().__init__()
self.x = x
self.y = y
def run(self):
for i in range(self.x,self.y):
print(str(i*i)+';')
thread1 = myThread(1,3)
thread2 = myThread(3,5)
thread1.start()
thread1.join()
thread2.start()
程序运行结果:
在thread1线程没有执行完前,thread2不会被执行的,只有thread1执行完后,thread2才会被执行。