如何在Python中依次运行两个进程

3
我想运行两个命令,一个接一个地执行。我的代码如下:
``` command1; command2; ```
请注意,这将按照顺序依次执行这两个命令。
baking.bake()
print "baking completed"

我的目标是运行baking.bake()(需要大约1分钟才能完成),并紧接着想要打印“烘焙开始”。最后,当烘焙完成时,我想打印“烘焙完成”。实质上:我怎样才能异步地运行bake()呢?

这是我的backing.py文件:

# Bake a texture map
from cgkit.cmds import load, worldObject, listWorld
from cgkit.rmshader import RMMaterial, RMShader
from cgkit.sceneglobals import Globals



def bake():
        Globals(
            bake = True,
            resolution = (512, 512),
            pixelsamples = (2,2),
            output = "ao_map.tif",
            displaymode = "rgba"
        )

        # Load the model
        load("singleSofa.obj")
        # Obtain a reference to the model
        model = worldObject("small_sofa_dark_grey")

        # Set the bake material
        mat = RMMaterial(
            surface = RMShader(
                "bake_ao.sl",
                samples = 1000,
            )
        )

        model.setMaterial(mat)

2
不清楚您想要什么。如果您想先运行第一行再运行第二行,那么这正是将会发生的事情。您想要避免什么? - marcelocra
@infostacker:我想要等待第一行命令完全完成,大约需要1分钟左右(运行时间不固定,可能会有所变化)。 - Dinesh
1
@LevLevitsky 恰好就是我的观点。 - marcelocra
1
baking.bake() 会创建一个新的进程或线程吗? - marcelocra
1
那个函数可能正在调度另一个进程来执行工作。否则,结果将会与您想要的完全一样。 - Lev Levitsky
显示剩余6条评论
2个回答

2
你可以使用 multiprocessing模块,代码如下:
from multiprocessing import Pool
import time

def something(i):
    time.sleep(2)
    return i+i

pool = Pool(processes=1)
res = pool.apply_async(something, [2])
print "Started something, waiting..."
# ...
print "Done with something. Result was: %s" % (res.get())

在您的情况下,我们可以执行以下操作:

from multiprocessing import Pool

# Create baking object and so forth.
# ...

pool = Pool(processes=1)
res = pool.apply_async(baking.bake)
print "Baking started"

# Then we do something while we wait...

res.get()
print "Baking done."

这里也是先打印消息,然后去执行。 - Dinesh
1
我们会生成一个新的进程(是的,进程),并异步调用它,这基本上相当于“在后台执行某些操作,并让它在完成时通知我们”,而不是等待它。如果您感兴趣,应该多了解一些线程、进程和更重要的异步概念。一些语言(如javascript++)默认情况下是异步的,而Python和大多数其他语言则不是,除非使用库。 - hermansc
好的,我明白了。我们必须在Python中包含库以实现异步执行,但我想知道代码中的“something”是什么? - Dinesh
啊,那只是一个示例。something 是我在第4行定义的函数。所以只需像这样调用它:pool.apply_async(baking.bake()) - hermansc
抱歉,这里没有等待和同步执行,甚至会抛出错误,例如“NoneType对象不可调用”。 - Dinesh
显示剩余9条评论

1
基本上,您可以使用 threading 模块及其 join 方法:
import threading    

def print_hello():
    for _ in range(3):
        print 'Hello'

hello_thread = threading.Thread(target=print_hello)
hello_thread.start()
hello_thread.join()

print "We're done!"

这段代码将打印:

Hello

Hello

Hello

We're done!

所以在您的情况下,您将创建一个线程:

bake_thread = threading.Thread(target=baking.bake)

然后只需简单地使用 start 启动线程并与其 join

但是在这里它没有起作用,它打印出了“我们完成了!”然后接下来它将进入baking.bake()并执行约1分钟。 - Dinesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接