线程和进程是计算机操作系统中的两个基本概念,它们都是实现多任务的方法,但在具体使用中有着不同的特点和适用场景。
线程和进程的区别
定义
进程是指在计算机中运行的一段程序,可以理解为一个程序的实例;线程是进程中的一个执行单元,是 CPU 调度和分派的基本单位。
内存分配
进程有独立的内存空间,进程之间相互隔离,一个进程的内存不会被其他进程访问。
线程共享所属进程的内存空间,线程之间可以访问同一进程的共享变量。
执行方式
进程是资源调度的基本单位,进程是由操作系统来进行调度的,任务从一个进程向另一个进程切换会导致较大的系统开销。
线程是调度的基本单位,线程在同一进程内并发执行,由进程中的线程调度子系统负责调度。
创建销毁时间
进程的创建销毁需要完成很多的工作,因此需要相对较多的时间。
线程的创建销毁比进程更快,因为线程共享所属进程的资源,其创建和销毁是有操作系统内核负责的,并且相对于进程而言,线程的创建和管理开销非常小。
Python代码实例
进程示例
Python 中进程的使用需要引入 multiprocessing 模块。下面是一个简单的示例,通过创建进程来计算一个数的阶乘。
import multiprocessing
def factorial(x):
if x == 1:
return 1
return x * factorial(x - 1)
if __name__ == "__main__":
p = multiprocessing.Process(target=factorial, args=(5,))
p.start()
p.join()
在上面的示例中,我们通过 multiprocessing 模块创建了一个进程,该进程调用了 factorial 函数来计算 5 的阶乘。通过调用 start 方法来启动该进程,join 方法等待该进程运行结束。
线程示例
Python 中线程的使用需要引入 threading 模块。下面是一个简单的示例,通过创建线程来模拟多个用户同时访问一个共享变量。
import threading
count = 0
lock = threading.Lock()
def add_one():
global count
lock.acquire()
count += 1
print("Thread {} adds one. Count is {}.".format(threading.current_thread().name, count))
lock.release()
if __name__ == "__main__":
for i in range(10):
t = threading.Thread(target=add_one, name="Thread-{}".format(i))
t.start()
在上面的示例中,我们通过 threading 模块创建了 10 个线程,每个线程访问全局变量 count 并对其加一。通过 Lock 对象来保证每个线程的互斥访问,避免同时对 count 进行写操作,导致值的错误。运行结果如下:
Thread Thread-0 adds one. Count is 1.
Thread Thread-1 adds one. Count is 2.
Thread Thread-3 adds one. Count is 3.
Thread Thread-4 adds one. Count is 4.
Thread Thread-2 adds one. Count is 5.
Thread Thread-7 adds one. Count is 6.
Thread Thread-5 adds one. Count is 7.
Thread Thread-9 adds one. Count is 8.
Thread Thread-8 adds one. Count is 9.
Thread Thread-6 adds one. Count is 10.
在上面的执行结果中,可以看到多个线程对同一变量进行并发的读写操作,而最终的结果是正确的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:线程和进程的区别及Python代码实例 - Python技术站