[英]Python: Executing multiple functions simultaneously
I'm trying to run two functions simultaneously in Python.我正在尝试在 Python 中同时运行两个函数。 I have tried the below code which uses multiprocessing
but when I execute the code, the second function starts only after the first is done.我尝试了以下使用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()
You are doing it correctly.你做得对。 :) :)
Try running this silly piece of code:尝试运行这段愚蠢的代码:
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()
You will see it print 'start func1' and then 'start func2' and then after a (very) long time you will finally see the functions end.您将看到它打印“start func1”,然后打印“start func2”,然后在(非常)很长时间后,您将最终看到函数结束。 But they will indeed execute simultaneously.但它们确实会同时执行。
Because processes take a while to start up, you may even see 'start func2' before 'start func1'.由于进程需要一段时间才能启动,您甚至可能会在“start func1”之前看到“start func2”。
This is just what i needed.这正是我所需要的。 I know it wasn't asked but i modified shashank's code to suit Python 3 for anyone else looking :)我知道它没有被问到,但我修改了 shashank 的代码以适合 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()
Substitute sys.maxsize for an number then print(rocket)and you can see it count up one at a time.将 sys.maxsize 替换为一个数字,然后打印(火箭),您可以看到它一次计数一个。 Get to a number and stop到达一个数字并停止
This can be done elegantly with Ray , a system that allows you to easily parallelize and distribute your Python code.这可以通过Ray优雅地完成,这是一个允许您轻松并行化和分发 Python 代码的系统。
To parallelize your example, you'd need to define your functions with the @ray.remote decorator
, and then invoke them with .remote
.要并行化您的示例,您需要使用@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()])
If func1()
and func2()
return results, you need to rewrite the code as follows:如果func1()
和func2()
返回结果,则需要将代码改写如下:
ret_id1 = func1.remote()
ret_id2 = func1.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])
There are a number of advantages of using Ray over the multiprocessing module.与多处理模块相比,使用 Ray 有许多优点。 In particular, the same code will run on a single machine as well as on a cluster of machines.特别是,相同的代码将在单台机器和机器集群上运行。 For more advantages of Ray see this related post .有关 Ray 的更多优势,请参阅此相关帖子。
This is a very good example by @Shashank.这是@Shashank 的一个很好的例子。 I just want to say that I had to add join
at the end, or else the two processes were not running simultaneously:我只想说最后必须加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()
Furthermore, Check this thread out: When to call .join() on a process?此外,请查看此线程: 何时在进程上调用 .join()?
Here is another version, if a dynamic list of processes need to be run.这是另一个版本,如果需要运行进程的动态列表。 I am including the two shell scripts, if you want to try it:如果您想尝试一下,我将包含两个 shell 脚本:
for i in {1..10}
do
echo "1... t.sh i:"$i
sleep 1
done
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
"lock" left there can be acquired before task " l.acquire()
" and released after " l.release()
"留在那里的“锁”可以在任务“ l.acquire()
”之前获取并在“ l.release()
”之后释放
#Try by using threads instead of multiprocessing
#from multiprocessing import Process
#import sys
import time
import threading
import random
rocket = 0
def func1():
global rocket
print('start func1')
while rocket < 100:
print("Im in func1")
rocket += 1
value = "Im global var "+str(rocket)+" from fun1"
print(value)
print ('end func1')
def func2():
global rocket
print ('start func2')
while rocket < 100:
print("Im in func2")
rocket += 1
value = "Im global var " + str(rocket) + " from fun2"
print(value)
print ('end func2')
if __name__=='__main__':
p1 = threading.Thread(target=func1)
p2 = threading.Thread(target=func2)
p1.start();p2.start()
#Hope it works
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.