使2个函数同时运行

Joh*_*ohn 39 python parallel-processing multithreading

我试图让2个函数同时运行.

def func1():
    print 'Working'

def func2():
    print 'Working'

func1()
func2()
Run Code Online (Sandbox Code Playgroud)

有谁知道如何做到这一点?

chr*_*ley 68

做这个:

from threading import Thread

def func1():
    print 'Working'

def func2():
    print 'Working'

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()
Run Code Online (Sandbox Code Playgroud)

  • 他可能想要知道,由于全局解释器锁,即使相关机器有多个CPU,它们也不会在同一时间执行.http://wiki.python.org/moin/GlobalInterpreterLock (17认同)
  • 当函数返回某些东西时如何获得结果? (6认同)
  • 没有理由使用两个import语句.只需使用第二个. (3认同)
  • 您如何为函数提供参数? (2认同)

Mat*_*son 12

关于线程的答案是好的,但你需要更具体地了解你想要做什么.

如果你有两个使用大量CPU的函数,那么线程化(在CPython中)可能会让你无处可去.然后你可能想看一下多处理模块,或者你可能想要使用jython/IronPython.

如果CPU绑定性能是原因,你甚至可以在(非线程)C中实现,并获得比在python中执行两个并行操作更大的加速.

没有更多信息,要想出一个好的答案并不容易.


Ion*_*ica 6

这可以通过Ray优雅地完成,这是一个允许您轻松并行化和分发 Python 代码的系统。

要并行化您的示例,您需要使用 定义函数@ray.remote decorator,然后使用 调用它们.remote

import ray

ray.init()

# Define functions you want to execute in parallel using 
# the ray.remote decorator.
@ray.remote
def func1():
    print("Working")

@ray.remote
def func2():
    print("Working")

# Execute func1 and func2 in parallel.
ray.get([func1.remote(), func2.remote()])
Run Code Online (Sandbox Code Playgroud)

如果func1()func2()返回结果,则需要稍微重写上面的代码,替换ray.get([func1.remote(), func2.remote()])为:

ret_id1 = func1.remote()
ret_id2 = func1.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])
Run Code Online (Sandbox Code Playgroud)

多处理模块或使用多线程相比,使用 Ray 有许多优点。特别是,相同的代码将在单台机器和机器集群上运行。

有关 Ray 的更多优势,请参阅此相关帖子


Edw*_*ard 5

一个选项,看起来像它使运行两个功能在同一
时间
,使用threading(例如在模块这个答案)。

但是,正如“官方Python文档”
页面所描述的那样,它的延迟很小。尝试使用的更好的模块是multiprocessing

另外,还有其他Python模块可用于异步执行(两个代码同时工作)。有关它们的一些信息并有助于选择它们,您可以阅读堆栈溢出问题。

另一个用户对threading模块的评论

他可能想知道,由于全局解释器锁定
,即使有
问题的计算机具有多个CPU,它们也不会在同一时间执行。wiki.python.org/moin/GlobalInterpreterLock

–乔纳斯·埃夫斯特伦(JonasElfström),2010年6月2日,11:39

引用文档中有关threading模块不起作用的信息

CPython实现细节:在CPython中,由于使用了全局解释器
锁,因此只有一个线程可以一次执行Python代码(即使
某些面向性能的库可能克服了此限制)。

如果希望您的应用程序更好地利用多核计算机的计算资源,建议您使用multiprocessing或current.futures.ProcessPoolExecutor。
但是,如果您
要同时运行多个I / O绑定任务,则线程化仍然是合适的模型。