python程序最多可以开多少个线程_一个Python多线程运行实例

f63ead649ff5356148c1ed2a24183cb7.png

20095cf862d9419305611446d855fef0.png
https://docs.python.org/3/library/concurrency.html

本文主要介绍Python的线程模块创建多个并发线程,并研究其对此计算机CPU使用率的影响。在撰写代码之前,先来看看这台计算机上可用的处理器数量,图中的处理器核数是1个处理器,2个核心以及4个逻辑处理器。这说明这台MacBook Pro笔记本有2个独立的完整的处理器核心,每个核心支持超线程,可以独立运行两个独立的应用程序。

e025fd00b769e04bb16ca11dcbc94a6e.png
CPU核心数目

这2个内核中的超线程并不意味着将获得双倍的性能。超线程利用处理器的未使用部分,如果一个线程暂停或不使用特定资源,则另一个线程可能能够使用它。在某些工作负载下,这可以提升整体性能改,但也依赖于具体应用程序。蓝色和红色图表显示了这些处理器的CPU利用率总百分比。在没有太多程序的时候,使用率保持在低位,图中显示闲置接近70%左右。

5fc984fa0fea96c76c2bebdb128b6624.png
CPU利用率

如果想单独查看每个处理器的CPU使用情况,可以通过单击任务管理器底部的打开资源监视器获取更多CPU信息。下面创建一个简短的示例程序,代码如下:

#!/usr/bin/env python3
""" Threads that waste CPU cycles """

import os
import threading

# a simple function that wastes CPU cycles forever
def cpu_waster():
    while True:
        pass

# display information about this process
print('n   Process ID: ', os.getpid())
print('Thread Count: ', threading.active_count())
for thread in threading.enumerate():
    print(thread)

for i in range(4):
    threading.Thread(target=cpu_waster).start()

# display information about this process
print('n  Process ID: ', os.getpid())
print('Thread Count: ', threading.active_count())
for thread in threading.enumerate():
    print(thread)
  

这里定义了一个简单的函数,叫做CPU waster,它其实一个while循环,没有做任何有用的工作,但运行该功能的线程将永远保持活跃并持续使用CPU资源。

运行程序,打印出有关的信息,包括进程ID号,进程中的线程总数,然后for循环打印有关每个线程的信息。之后的for循环创建并启动4个waster线程。我在这里启动了4个线程,因为这是该系统中处理器数量的全部。在启动这些线程后,程序再次打印出改进程相关信息。

可以看到操作系统为此进程分配了ID号62457,并且当该进程最初启动时,只有一个主要执行线程。然后,在启动4个CPU浪费线程后,进程ID是不变的,但现在程序总共有5个线程。当Python创建了每个线程时,操作系统给它们分配线程号,以及唯一的线程标识符号。

$ python multi-threads.py

  Process ID:  62457
Thread Count:  1
<_MainThread(MainThread, started 4492457408)>

  Process ID:  62457
Thread Count:  5
<_MainThread(MainThread, started 4492457408)>
<Thread(Thread-1, started 123145390870528)>
<Thread(Thread-2, started 123145396125696)>
<Thread(Thread-3, started 123145401380864)>
<Thread(Thread-4, started 123145406636032)>

现在,如果切换到任务管理器,可以看到与运行程序之前相比,整体CPU使用率有所增加。但总的来说,考虑到我有4个线程正在运行,利用率依然非常低。这是因为Python的全局解释器锁只允许其中一个线程在任何给定时刻实际执行。所以最多这个程序只能使用一个CPU资源。

cfa7969aca7d6e447c7ca9497f5ef13b.png

查看进程选项卡,看到一个名为Python3.6的进程,它与之前显示的相同进程ID号。同时线程列中有5个线程。在平均CPU列中这个处理使用了大概25%的CPU,这对应于使用计算机中4个逻辑处理器中的一个。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我之前回答的还是这个问题。以下是一个稍微复杂一点的 Python 多线程实例,可以用来计算一个矩阵的乘积: ```python import threading import numpy as np # 定义矩阵的大小 MATRIX_SIZE = 1000 # 初始化两个随机矩阵 matrix_a = np.random.rand(MATRIX_SIZE, MATRIX_SIZE) matrix_b = np.random.rand(MATRIX_SIZE, MATRIX_SIZE) # 初始化结果矩阵 result_matrix = np.zeros((MATRIX_SIZE, MATRIX_SIZE)) # 定义一个函数,用来计算矩阵的乘积 def multiply(start, end): for i in range(start, end): for j in range(MATRIX_SIZE): for k in range(MATRIX_SIZE): result_matrix[i][j] += matrix_a[i][k] * matrix_b[k][j] # 定义线程数量 NUM_THREADS = 4 # 计算每个线程需要计算的行数 rows_per_thread = MATRIX_SIZE // NUM_THREADS # 创建线程列表 threads = [] # 启动线程 for i in range(NUM_THREADS): start = i * rows_per_thread end = (i + 1) * rows_per_thread t = threading.Thread(target=multiply, args=(start, end)) threads.append(t) t.start() # 等待所有线程结束 for t in threads: t.join() # 检查结果是否正确 expected_result = np.dot(matrix_a, matrix_b) assert np.array_equal(result_matrix, expected_result) # 输出 Done 表示程序执行完毕 print("Done") ``` 这个例子首先初始化两个随机矩阵,然后定义一个函数 multiply,用来计算这两个矩阵的乘积。然后,它将矩阵分成若干个部分,每个部分分配给一个线程来计算。最后,它等待所有线程结束,检查结果是否正确,并输出 Done 表示程序执行完毕。 希望这个例子能够帮助您更好地理解 Python 多线程的使用方法。 ### 回答2: Python多线程实例是指在Python编程语言中使用多线程进行并发编程的实例。在Python中,可以使用内置的threading模块来创建和管理多线程。 通过创建多线程,可以在程序中同时执行多个任务。这对于需要同时处理多个任务的情况非常有用。例如,在下载大文件时,可以使用多线程同时下载多个文件,加快下载速度。此外,多线程还可以用于处理网络请求、图像处理、数据处理等耗时操作,提高程序运行效率。 使用Python多线程的主要步骤如下: 1. 导入threading模块。 ``` import threading ``` 2. 创建一个线程对象,可以通过继承threading.Thread类或使用threading.Thread()函数创建。 ``` class MyThread(threading.Thread): def __init__(self, name): super().__init__() self.name = name def run(self): # 线程执行的代码 print("Hello, " + self.name) thread1 = MyThread("Thread 1") thread2 = threading.Thread(target=func, args=("Thread 2",)) ``` 3. 启动线程。 ``` thread1.start() thread2.start() ``` 4. 等待线程结束。 ``` thread1.join() thread2.join() ``` 以上代码演示了两种创建多线程的方法:1)继承threading.Thread类,重写run方法;2)使用函数作为线程的执行内容。线程的启动调用start()方法,等待线程结束使用join()方法。 需要注意的是,Python多线程的并发程度受到全局解释器锁(GIL)的限制,因此对于计算密集型的任务,多线程并不能发挥出多核的优势。如果需要发挥多核性能,可以考虑使用多进程编程。 总之,Python多线程实例能够提高程序的并发处理能力,适用于需要同时处理多个任务的场景。通过合理设计线程的数量和任务分配,可以提高程序的性能和效率。 ### 回答3: Python多线程实例是指通过使用多线程的技术来提高Python程序运行效率和性能。在Python中,我们可以使用threading模块来实现多线程多线程技术可以同时执行多个任务,提高程序运行速度。在Python中,我们可以通过创建Thread对象并调用start()方法来启动一个线程。下面是一个简单的例子: import threading def print_numbers(): for i in range(1, 11): print(i) def print_letters(): for letter in ['A', 'B', 'C', 'D', 'E']: print(letter) # 创建两个线程 t1 = threading.Thread(target=print_numbers) t2 = threading.Thread(target=print_letters) # 启动两个线程 t1.start() t2.start() # 等待两个线程结束 t1.join() t2.join() # 主线程继续执行 print("主线程结束") 以上代码中,我们创建了两个线程,分别执行print_numbers()和print_letters()函数。通过调用start()方法启动线程,并通过join()方法等待两个线程执行完毕。最后,主线程继续执行并打印出一段文字。 需要注意的是,多线程并不一定能提高程序运行速度,因为在Python中,全局解释器锁(Global Interpreter Lock,GIL)会限制同一时间只能有一个线程执行Python字节码。因此,在CPU密集型任务中,多线程并不能真正实现并行计算。但是,在IO密集型任务中,多线程能够提高程序运行效率。 总结起来,Python多线程实例可以通过使用threading模块来实现。多线程能够提高IO密集型任务的运行效率,但在CPU密集型任务中并不能真正实现并行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值