首页 > 编程知识 正文

Python多线程多进程用法介绍

时间:2023-11-22 02:17:15 阅读:288580 作者:HGXK

多线程和多进程是Python多任务处理的两种方式。多线程是同一时间运行多个线程,多进程是同一时间运行多个进程。本文将从以下几个方面对Python多线程和多进程进行详解:

一、线程与进程的概念及区别

线程是进程的一部分,是程序执行的最小单元,每个线程拥有自己的堆栈和局部变量,但它们共享进程的全局变量和内存。一个进程可以有多个线程。

进程是正在运行的应用程序,它拥有自己的地址空间、堆栈、文件句柄和其他资源。一个进程可以包含多个线程,线程间要通过进程来通信。

区别:

  • 进程间通信困难,需要使用特定的方法(如IPC);线程间通信简单,使用共享内存或消息传递即可。
  • 进程间切换开销较大;线程间切换开销较小。
  • 同一个进程的线程之间共享进程的内存,而进程之间的内存是独立的。
  • 每个进程都有各自独立的Python解释器进程;线程共享所属进程的Python解释器。

二、Python多线程

1、创建线程

在Python中,创建线程的最简单的方式是使用threading模块的Thread对象。

import threading

# 定义一个函数作为线程的执行体
def action(max):
    for i in range(max):
        print(threading.current_thread().name + " " + str(i))

# 创建并启动一个线程
threading.Thread(target=action, args=(100,), name='Thread-A').start()

# 创建并启动另外一个线程
threading.Thread(target=action, args=(200,), name='Thread-B').start()

2、线程同步

如果多个线程同时访问共享资源,就可能引发竞态条件,导致结果不正确。可使用锁机制来避免线程之间的竞态条件。

import threading

# 设置全局变量x和Lock对象
x = 0
lock = threading.Lock()

# 线程的执行函数
def add():
    global x 
    # 获取资源锁
    lock.acquire()
    for i in range(100000):
        x += 1
    # 释放资源锁
    lock.release()

# 创建10个线程,启动线程
for j in range(10):
    threading.Thread(target=add).start()

# 等待所有线程执行完毕
for th in threading.enumerate():
    if th != threading.currentThread():
        th.join()

print(x) # 输出结果为1000000

三、Python多进程

1、创建进程

可以使用multiprocessing模块的Process对象来创建进程。

import multiprocessing

# 子进程执行函数
def worker():
    print("I'm process {0}, my parent is {1}".format(multiprocessing.current_process().pid, multiprocessing.current_process().name))

# 创建并启动子进程
processes = []

for i in range(5):
    process = multiprocessing.Process(target=worker)
    processes.append(process)
    process.start()

# 等待所有进程执行完毕
for process in processes:
    process.join()

2、进程池

如果需要同时启动多个子进程,可以使用进程池。

import multiprocessing

# 子进程执行函数
def worker(num):
    print("Worker {0} is running".format(num))

# 创建进程池
pool = multiprocessing.Pool(processes=3)

# 启动10个子进程
for i in range(10):
    pool.apply_async(worker, args=(i, ))

# 关闭进程池。关闭进程池之后不能再向其中添加新的任务。
pool.close()

# 等待所有子进程执行完毕
pool.join()

四、总结

Python的多线程和多进程,都可以很好地发挥多核CPU的性能优势,提高程序执行效率。但需要注意线程同步和进程间通信的问题,避免线程间竞态条件和进程间数据冲突,保证程序执行正确性。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。