【发布时间】:2019-05-28 12:50:57
【问题描述】:
我正在尝试理解 python 中的多线程,但是我阅读的每个示例都非常简单且彼此相似,并且不符合我的目的。
我正在执行高级数学计算任务,所以我需要使用 python 多线程。我需要使用多线程而不是多处理来避免内存问题。
您将在下面找到一个我想执行多线程的简单数学问题(不是实际问题,但让我了解线程)。所以我需要在两个不同的线程上同时并行运行task#1(square)和task#2(inve)(等待两者的结果),然后使用两者的结果来获得最终结果回到主线程。
请在 python (Thread, ThreadPool, ThreadPoolExecutor) 中使用任何你喜欢的线程选项,与串行代码相比,真正节省时间和成本
如果有人有更好的想法让这段代码运行得更快,请分享一下
import scipy
import numpy
def square(A):
# take the square root of a matix
y = scipy.linalg.sqrtm(A)
return y
def inve(A):
# take the inverse of a matrix
y = numpy.linalg.inv(A)
def main(A):
# A is a matrix
# a is the square root of a matrix
# b is the inverse of a matix
# Run the first task on one thread
a = square(A)
# Run the second task in-parallel in another thread
b = inve(A)
# and then run final result in main thread
result = a * b
return result
A=[[1,2],[3,4]]
result = main(A)
【问题讨论】:
-
您在实现多线程时是否遇到任何问题,我们可以提供帮助?
-
感谢您的回复。是的,我不能完全理解我们如何为类似的例子做线程。例如,如果我使用 threading.Thread,我不知道如何获取输出并等待它。所以,如果你能帮助我并使用我上面解释的多线程重写这段代码。如果你这样做,我真的很感激你。正如我所解释的,我需要并行运行这两个任务,然后等待输出,然后使用两个输出来获得最终结果
-
由于你没有线程的基础知识,你可以去这里realpython.com/intro-to-python-threading或这里geeksforgeeks.org/multithreading-python-set-1或这里pythonprogramming.net/threading-tutorial-python。您可以在此处获得答案,但它们不会像这些网站提供的这些教程那样完整。
-
CPU 密集型任务不会受益于 Python 中的多线程,除非您使用 Jython 或 IronPython。 CPython 的内存管理不是线程安全的,因此它使用Global Interpreter Lock,线程必须先获取它才能访问 Python 对象。在任何给定时间,只有一个线程可以执行字节码。 CPython 中的线程更适合 I/O 绑定任务。如果需要并行化,应通过多处理来完成 CPU 绑定任务
-
天啊,我感觉很失落。您能否以您喜欢的任何方式向我展示,您将如何解决这个问题以提高效率并减少时间。请使用您喜欢的任何库重写这个简单的问题,然后我可以在这个库上阅读更多内容,看看它是如何工作的。如果您为我重写它,我将不胜感激。谢谢
标签: python multithreading multiprocessing