【问题标题】:Python - Why doesn't multithreading increase the speed of my code?Python - 为什么多线程不能提高我的代码速度?
【发布时间】:2019-09-04 18:59:32
【问题描述】:

我尝试通过使用和不使用两个线程来改进我的代码:

from threading import Lock
from threading import Thread
import time

start_time = time.clock()

arr_lock = Lock()

arr = range(5000)

def do_print():
    # Disable arr access to other threads; they will have to wait if they need to read
    a = 0
    while True:
        arr_lock.acquire()
        if len(arr) > 0:
            item = arr.pop(0)
            print item
            arr_lock.release()
            b = 0
            for a in range(30000):
                b = b + 1
        else:
            arr_lock.release()
            break
thread1 = Thread(target=do_print)
thread1.start()
thread1.join()

print time.clock() - start_time, "seconds"

当运行 2 个线程时,我的代码的运行时间增加了。有谁知道为什么会发生这种情况,或者可能知道提高代码性能的不同方法?

【问题讨论】:

  • Python 与多线程不是很兼容,因为它是如何实现的。有非常具体的用途,多线程可以显着提高性能。它与 GIL 有关,您可以找到更多信息here
  • @JuanC,如果您说“多处理”而不是“多线程”,您的评论会更有意义。 CPython 程序中的多个线程几乎可以做任何其他语言中的多个线程可以做的所有事情,除了同时使用多个 CPU。这就是 GIL 所阻止的。
  • @עומר ששוני,在t.start() 之后的下一行写t.join() 是没有意义的。创建新线程的全部要点是让调用者在线程运行时执行其他操作(即,在start() 调用之后和join() 调用之前。)
  • @SolomonSlow 所以中篇文章有误?
  • @JuanC,我看那篇文章没有错,但是当我说“多处理”时我犯了一个错误。我忘记了,Python 程序员使用这个词的方式很特殊,即描述一个由多个协作进程组成的单个 Python 应用程序。从这个意义上说,Python 与多处理“非常兼容”。但“多处理”更普遍地意味着在单个主机上利用多个 CPU 的任何技术。 Python 线程作为一种实现更广泛意义上的多处理的手段并不有用,但它们对于人们使用线程的几乎所有其他原因都很有用。

标签: python multithreading performance operating-system


【解决方案1】:

您没有看到多线程的任何性能改进的主要原因是您的程序一次只允许一个线程执行任何有用的操作。另一个线程总是被阻塞。

两件事:

删除在锁内调用的打印语句。 print 语句会极大地影响性能和时间。此外,到 stdout 的 I/O 通道本质上是单线程的,因此您在代码中构建了另一个隐式锁。所以让我们删除打印语句。

使用适当的睡眠技术而不是“自旋锁定”并从 0 计数到 30000。那只会不必要地烧毁内核。

试试这个作为你的主循环

while True:
    arr_lock.acquire()
    if len(arr) > 0:
        item = arr.pop(0)
        arr_lock.release()
        time.sleep(0)
    else:
        arr_lock.release()
        break

这应该会稍微好一些...我什至主张完全去掉 sleep 语句,这样你就可以让每个线程都有一个完整的时间段。

但是,由于每个线程要么“什么都不做”(在获取时处于休眠或阻塞状态),要么在锁定时只对数组执行一次 pop 调用,因此大部分时间都将用于获取/释放调用而不是实际操作数组。因此,多线程不会让您的程序运行得更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多