2016-11-08 224 views
1

我正努力使用下面的代码使用Multiprocessing的Process函数同时运行2个函数。我最后的努力是运行一个定时器,它将在脚本的主体内部进行检查。如果时间已经完成,主体中的依赖关系会触发自己的行为。如果时间没有完成,它会转到下一个动作。Python 3同时运行多个函数

我在MacBook Pro上与构建运行以下命令: 处理器名称:Intel酷睿2双核处理器 速度:1 核心总数:2

脚本2.66 GHz的 处理器数量:

#!/usr/bin/pyton 

# MODULES 
import time 
from multiprocessing import Process 

# GLOBAL VARIABLES 
Completion = '' 

# FUNCTIONS 
def Timer(duration): 
     global Completion 
     Ticker = 0 
     while Ticker != duration: 
       Ticker = Ticker + 1 
       print(Ticker) 
       time.sleep(1) 

     Completion = '{0}TickerDone'.format(duration) 

def Wait(seconds): 
     time.sleep(seconds) 

#MAIN 
P1 = Process(target = Timer(10)) 
P1.start() 

P2 = Process(target = Wait(11)) 
P2.start() 

P1.join() 
P2.join() 

print(Completion) 

if Completion == '10TickerDone': 
     print('Good to go!\n') 
else: 
     print('Not yet!\n') 

# END 

两个功能做什么是例外,然而第二功能,其旨在以等待10个+ 1 secondards用于第一功能的完成,仅开始一旦第一功能,10秒计时器,是完成。所以,在本质上,我必须等待21秒来测试10秒计时器。

结果:

$ python Test.py 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
10TickerDone 
Good to go! 

我需要做的是在并行运行这两个功能,所以如果第一个功能是执行第三功能之前完成第二功能可以测试了。

我哪里错了?

+0

注意的文件,我尝试同样的事情线程,线程与进程替换,但有相同的结果。 – danjmwalker

+0

嗨马克,我确实尝试写出来,因为你有它,但我得到相同的结果。 (), – danjmwalker

+0

P1 =过程(目标=定时器(10),参数=(10,)) P2.start() P2 =过程(目标=等待,参数=(11,)) P2.start – danjmwalker

回答

1

你的主要问题是,你没有在子进程中运行你的目标函数,你直接运行,然后开始另一个进程。

当你做这样的代码: P1 = Process(target = Timer(10)) Python会imediattely解决表达了target=部分的左 - 和调用函数,至极将等待10秒钟,然后创建一个子对象,其目标实际上是返回该函数的值(None)。

所以,如果你只是做:

#MAIN 

P1 = Process(target=Timer, args=(10,)) 
P1.start() 

P2 = Process(target=Wait, args=(11,)) 
P2.start() 

你将开始看到的东西在你想要的方向发展。 看看不同之处:在这里我使用函数名称(根据约定可以是小写,顺便说一句),名称后面没有直接的“开放圆括号”。 Python中变量或函数名称后面的括号表示一个同步对象调用(本例中为函数调用)。不带圆括号的同名的使用将该函数作为您正在创建的Process对象的参数传递。参数在args参数中分开传递。

但除此之外,多处理根本无法使用全局变量 - 正如名称所示,每个函数都在不同的进程中运行,并且有自己的一组全局变量)。

相反,您必须做一些更复杂的事情,并使用(多处理)Queue作为子进程中每个入口点的参数传递,以协调您的并行代码的操作。

检查在https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues

+0

谢谢,jsbueno。我最后的评论,我在第一个函数之后加入了(),是我的不好,打字太快了。感谢您的链接。我相信你是对的。我会花一点时间阅读文档。 – danjmwalker