Python多线程与GIL锁

科技资讯 投稿 11300 0 评论

Python多线程与GIL锁

Python多线程与GIL锁

python多线程

import threading

def print_numbers(:
    for i in range(1, 6:
        print(i

thread1 = threading.Thread(target=print_numbers
thread2 = threading.Thread(target=print_numbers

thread1.start(
thread2.start(

thread1.join(
thread2.join(

print("Done"

上述代码创建了两个线程分别同时去打印1-5数字,但是即使有多个cpu,同一时刻也只能打印一个数字!why?

GIL锁

GIL的存在主要是为了防止Python解释器中的数据结构被多个线程同时修改,导致数据结构出现不一致的情况。通过限制同一时刻只有一个线程能够执行Python字节码,GIL可以确保Python解释器中的数据结构不会被多个线程同时修改,从而保证线程安全。

IO任务

这些IO任务通常只占用内存和网络,不占用CPU资源,所以也不占用python解释器,因此如果是IO密集型任务,python的多线程优势才能体现出来,而CPU密集型任务python的多线程效率无法有效提升。

破解GIL锁的限制

多核处理器(必须是真正的多核处理器才能体现,否则还是单进程)的优势。

python多进程

    导入multiprocessing模块,创建进程池对象。可以通过Pool(函数创建进程池对象,指定最大进程数。
  1. 定义需要执行的任务函数。这个函数应该能够接受任务参数,处理任务,返回任务结果。
  2. 调用进程池对象的map(函数,传入任务函数和任务参数。该函数会将任务参数分配给进程池中的进程执行,并返回任务结果列表。
  3. 处理任务结果。根据任务函数的返回值,对任务结果进行处理。可以使用Python中的其他模块,如pandas、numpy等进行数据处理或结果可视化。

需要注意的是,在Python中使用多进程编程时,进程之间的通信和同步是需要考虑的问题。Python中的multiprocessing模块提供了一些同步原语,如Lock、Semaphore等,用于控制进程之间的访问。此外,也可以使用Python中的Queue模块实现进程之间的通信。

import multiprocessing

def worker(num:
    """任务函数"""
    print('Worker %d is running' % num
    return num**2

if __name__ == '__main__':
    # 创建进程池对象
    pool = multiprocessing.Pool(processes=4
    # 任务参数列表
    nums = [1, 2, 3, 4, 5]
    # 执行任务并获取结果
    results = pool.map(worker, nums
    print(results

python多进程与多线程的结合

每个进程用多个线程执行,这样可以在每个进程内部实现并行处理IO任务,同时也可以充分利用多核处理器的优势。

代码示例:

import multiprocessing
import threading

def worker(num:
    """线程函数,用于处理任务"""
    print(f"Worker {num} is running..."

def main(:
    """主函数,创建多个进程和线程"""
    # 创建3个进程
    processes = []
    for i in range(3:
        p = multiprocessing.Process(target=process_worker, args=(i,
        processes.append(p
        p.start(

    # 在每个进程内部创建2个线程
    for p in processes:
        for i in range(2:
            t = threading.Thread(target=worker, args=(i,
            t.start(

if __name__ == '__main__':
    main(

编程笔记 » Python多线程与GIL锁

赞同 (61) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽