同时运行2个功能

问题描述 投票:42回答:7

我正在尝试使两个功能同时运行。

def func1():
    print 'Working'

def func2():
    print 'Working'

func1()
func2()

有人知道该怎么做吗?

python multithreading parallel-processing
7个回答
71
投票

执行此操作:

from threading import Thread

def func1():
    print('Working')

def func2():
    print("Working")

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()

12
投票

The answer about threading很好,但是您需要对要执行的操作更加具体。

如果您有两个函数都占用大量CPU,则线程(在CPython中)可能无济于事。然后,您可能想看一下multiprocessing module,或者可能要使用jython / IronPython。

如果是受CPU限制的性能,您甚至可以在(非线程)C中实现这些功能,并且比在python中执行两个并行操作要快得多。

没有更多信息,要找到一个好的答案并不容易。


5
投票

一个选项,看起来让两个函数同时运行时间,正在使用threading模块(threading答案中的示例)。

但是,作为官方Python文档,它的延迟很小this描述。尝试使用的更好的模块是page

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

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

他可能想知道,因为全局翻译锁定即使计算机处于运行状态,它们也不会在完全相同的时间执行问题有多个CPU。 this

– JonasElfströmthreading

从文档中引用wiki.python.org/moin/GlobalInterpreterLock模块不起作用

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

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


2
投票

这可以通过Jun 2 '10 at 11:39轻松完成,该系统使您可以轻松地并行化和分发Python代码。

为了并行化示例,您需要使用threading定义函数,然后使用Ray调用它们。

@ray.remote decorator

[如果.remoteimport 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()]) 返回结果,则需要用func1()替换为:]重写上面的代码:>

func2()

使用Ray比ray.get([func1.remote(), func2.remote()])模块或使用多线程有许多优点。特别地,same code

将在单台计算机以及一台计算机集群上运行。

有关Ray的更多优点,请参见ret_id1 = func1.remote() ret_id2 = func1.remote() ret1, ret2 = ray.get([ret_id1, ret_id2]) 。>>

尝试一下

multiprocessing

与多进程不同,线程模块确实可以同时工作,但是计时有点差。下面的代码打印“ 1”和“ 2”。这些分别由不同的功能调用。我确实注意到,将它们打印到控制台时,它们的时序会稍有不同。

this related post

输出:(请注意空格是打印之间的等待时间)

from threading import Thread

def fun1():
    print("Working1")
def fun2():
    print("Working2")

t1 = Thread(target=fun1)
t2 = Thread(target=fun2)

t1.start()
t2.start()

不确定是否有办法纠正它,或者根本不重要。我注意到的东西。

我认为您要传达的内容可以通过多处理来实现。但是,如果要通过线程执行此操作,则可以执行此操作。这可能有帮助

   from threading import Thread

   def one():
       while(1 == num):
           print("1")
           time.sleep(2)

   def two():
       while(1 == num):
           print("2")
           time.sleep(2)


   p1 = Thread(target = one)
   p2 = Thread(target = two)

   p1.start()
   p2.start()

0
投票

尝试一下


0
投票

与多进程不同,线程模块确实可以同时工作,但是计时有点差。下面的代码打印“ 1”和“ 2”。这些分别由不同的功能调用。我确实注意到,将它们打印到控制台时,它们的时序会稍有不同。


0
投票

我认为您要传达的内容可以通过多处理来实现。但是,如果要通过线程执行此操作,则可以执行此操作。这可能有帮助

© www.soinside.com 2019 - 2024. All rights reserved.