【发布时间】: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