的Python:同时执行多个功能

问题描述 投票:19回答:5

我想在Python两种功能同时运行。我曾尝试下面的代码,它使用multiprocessing但是当我执行的代码,首先是做了之后第二个功能启动。

from multiprocessing import Process
def func1:
     #does something

def func2:
     #does something

if __name__=='__main__':
     p1 = Process(target = func1)
     p1.start()
     p2 = Process(target = func2)
     p2.start()
python
5个回答
44
投票

你是做正确。 :)

尝试运行这个无聊的一段代码:

from multiprocessing import Process
import sys

rocket = 0

def func1():
    global rocket
    print 'start func1'
    while rocket < sys.maxint:
        rocket += 1
    print 'end func1'

def func2():
    global rocket
    print 'start func2'
    while rocket < sys.maxint:
        rocket += 1
    print 'end func2'

if __name__=='__main__':
    p1 = Process(target = func1)
    p1.start()
    p2 = Process(target = func2)
    p2.start()

你会看到它打印“开始FUNC1”,然后“开始FUNC2”,然后(非常)长的时间后,你会终于看到了功能结束。但是,他们确实将同时执行。

由于过程需要一段时间才能启动,您可能会看到“开始FUNC1”前“开始FUNC2”。


14
投票

这是我所需要的。我知道这是没有问,但我修改沙善的代码,以满足Python 3中为别人寻找:)

from multiprocessing import Process
import sys

rocket = 0

def func1():
    global rocket
    print ('start func1')
    while rocket < sys.maxsize:
        rocket += 1
    print ('end func1')

def func2():
    global rocket
    print ('start func2')
    while rocket < sys.maxsize:
        rocket += 1
    print ('end func2')

if __name__=='__main__':
    p1 = Process(target=func1)
    p1.start()
    p2 = Process(target=func2)
    p2.start()

一个数字替代了sys.maxsize然后打印(火箭),你可以看到它计数一次一个。获取电话号码,并停止


2
投票

这是@Shashank一个很好的例子。我只想说,我不得不在末尾添加join,否则这两个过程不同时运行:

from multiprocessing import Process
import sys

rocket = 0

def func1():
    global rocket
    print 'start func1'
    while rocket < sys.maxint:
        rocket += 1
    print 'end func1'

def func2():
    global rocket
    print 'start func2'
    while rocket < sys.maxint:
        rocket += 1
    print 'end func2'

if __name__=='__main__':
    p1 = Process(target = func1)
    p1.start()
    p2 = Process(target = func2)
    p2.start()
    # This is where I had to add the join() function.
    p1.join()
    p2.join()

此外,检查此线程出来:When to call .join() on a process?


2
投票

这可以用优雅来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():
    #does something

@ray.remote
def func2():
    #does something

# Execute func1 and func2 in parallel.
ray.get([func1.remote(), func2.remote()])

如果func1()func2()返回结果,你需要按如下重写代码:

ret_id1 = func1.remote()
ret_id2 = func1.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])

有一些使用雷在multiprocessing模块的优势。特别地,相同的代码将计算机集群上的单台机器上,以及运行。对于雷的更多的优势看this related post


0
投票

这里是另一个版本,如果需要运行过程的动态列表。我包括两个shell脚本,如果你想尝试一下:

他1.是

for i in {1..10}
  do 
     echo "1... t.sh i:"$i
     sleep 1
  done

他2.是

   for i in {1..3}
   do
       echo "2.. t2.sh i:"$i
       sleep 1
   done

哪怕.朋友

import os
from multiprocessing import Process, Lock

def f(l, cmd):
    os.system(cmd)

if __name__ == '__main__':
    lock = Lock()

    for cmd in ['sh t1.sh', 'sh t2.sh']:
        Process(target=f, args=(lock, cmd)).start()

产量

1... t.sh i:1
2.. t2.sh i:1
1... t.sh i:2
2.. t2.sh i:2
1... t.sh i:3
2.. t2.sh i:3
1... t.sh i:4
1... t.sh i:5
1... t.sh i:6
1... t.sh i:7
1... t.sh i:8
1... t.sh i:9
1... t.sh i:10

“锁定”左边有能任务“l.acquire()”收购之前和之后发布的“l.release()

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