2014-01-10 68 views
3

我知道不可能在Python中同时运行多个循环。无论如何,我需要实现的是我有一个循环运行读取传感器数据的负载,每0.25秒。 同时我有信号设备并行运行,需要每3秒发送一次信号。 我的问题是通过哪种方式实现这一目标?Python多个循环在同一时间

编写两个脚本并行运行它们有意义吗? 使用线程是否有意义? 有没有其他的可能性,以使这项工作?

我对代码示例非常感兴趣。

谢谢!

编辑: 两个循环都是完全独立的。 因此,假设脚本1正在运行,读取传感器数据,当其中一个传感器收到值< 300时,它应该运行脚本2,它将发送信号。在传感器数据> 300的同时,它应该停止脚本2.

+0

您可以使用按时间排序的操作的优先级队列在一个循环中执行所有操作。在循环中,弹出一个项目,等到它的时间到期,执行它的操作,然后在3秒或25秒后安排一个新的项目。 –

+0

你如何检查这些循环中的时间间隔?那些读取和发送阻止循环?最简单的选择是尝试每12个读取传感器数据一次发送一个“发送信号”。 –

+0

研究Python的'线程' - 当然可以同时运行多个循环。 – jayelm

回答

6

“Python多个循环在同一时间,我知道这是不可能的[...]” - 这看起来很有趣。

可以同时运行两个循环,完全如何描述它。这两种方式都很有意义,取决于你实际需要和想要的东西。如果任务完全独立,则应将其作为两个脚本运行。如果你需要这两个循环来实现一个任务,并且它们在一个文件中是有意义的,你可以使用multiprocessing

测试python 2.7.5+和3.3.2+。

下面是一些小例子:

from multiprocessing import Process 
import time 

def f(name): 
    print('hello', name) 
    time.sleep(10) 

def d(name): 
    print('test2', name) 
    time.sleep(10) 

if __name__ == '__main__': 
    p1 = Process(target=f, args=('bob',)) 
    p2 = Process(target=d, args=('alice',)) 
    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 

脚本运行10秒和两个字符串被打印向右走,这意味着一切正常。

time python3 ./process.py 
hello bob 
test2 alice 

real 0m10.073s 
user 0m0.040s 
sys 0m0.016s 
+0

对不起,我的英语不好:) 这些循环是独立的,请参阅我的问题编辑。 – Daniel

+0

那么如果解决方案看起来如果这些任务完全独立,我想将它作为两个脚本运行,那么该如何解决呢? – Daniel

+0

将'f()'放入'f.py'后台运行,并将'd()'放入'd.py'并在后台运行。从您的描述中,脚本不必交流,只需继续运行即可。没有什么更多了。您必须了解如何在您的系统上运行bg中的任务,但它是单独的独立问题。 – luk32

0

也可以通过运行多个脚本和一些作为.pyw为了方便,让他们通过UDP套接字交换信息。注意127.0.0.1将在任何情况下发送给您自己。另外,对于端口,只要确保没有其他程序使用您使用的端口。与其他程序一样,我的意思是任何使用端口或甚至基本路由器设置的程序。

样品(发送)

import os 
from sockets import * 
host = "ip" 
port = "9000" 
addr = (host, port) 
UDPSock = socket(AF_INET, SOCK_DGRAM) 
data = "Random Text" 
send = data.encode("ascii") 
UDPSock.sendto(send, addr) 
UDPSock.close() 

样品(接收)

import os 
from socket import * 
host = "" 
port = 9000 
addr = (host, port) 
UDPSock = socket(AF_INET, SOCK_DGRAM) 
UDPSock.bind(addr) 
(data, addr) = UDPSock.recvfrom(1024)#1024 is MAX bytes to receive 
data = data.decode('ascii') 
UDPSock.close() 

您可以使用这些单独运行循环,并告诉如何从两个单独的程序做的。