2012-07-10 148 views
1

我是Python新手(通常编程),请耐心等待。Python中的异步事件

我正在做一些实验室设备自动化,我正在寻找一种方法来切换一台设备的电源,同时在另一台设备上获取数据。我希望这些事件彼此异步,即我希望在数据采集过程中随机切换电源。

我已经签出了以下内容:

-time.sleep - 我居然能在一个设置成功使用此,因为电源是响应很慢 - 我告诉它关闭然后休息一段时间,然后开始在其他设备上采集数据。这依赖于电源总是比其他设备反应慢得多,通常情况不是这样。

-multiprocessing/threading - 我一直在阅读关于SO和python.org的这个问题,但我还不清楚这是否能完成我想要的功能。我试图测试它,但是我发现它很难编码,如果它不在我想要的位置附近,我不想再投入更多时间。

所以,简而言之:多处理会做我想要的吗?有没有其他方法可以做到这一点?

+2

你可以看看扭曲:[TwistedMatrix](http://twistedmatrix.com/trac/) – 2012-07-10 23:33:09

+0

扭曲的方式很酷,但从事情的声音一个简单的线程应该罚款。你没有说任何关于通信发生的事情(http,socket,还有其他的东西?)。这可能会影响你的解决方案 – 2012-07-10 23:35:53

+1

只是标准线程应该可以正常工作......不需要任何花哨 – 2012-07-10 23:37:31

回答

1

看起来你想要一个简单的线程模型,在那里你为你想要在后台执行的任务(电源切换或数据获取)创建一个线程。这里有一个例子(未经测试的代码):

from threading import Thread                      

def take_data(): 
    while 1:                    
     data = go_fetch_more_data() 

data_thread = Thread(target=take_data) 
data_thread.start() 

while 1: 
    sleep_seconds = random.randint(0, 60)   
    time.sleep(sleep_seconds) 
    toggle_power() 

注意 - 使用这种方法停止程序的唯一方法是杀死它。如果您需要监视某种关机信号,则必须为每个关机信号创建一个线程。然后,你会想要一个优雅的方式来关闭每个线程。我会举一个例子,但我并不完全清楚Python的最佳实践。

1

如果您希望在Python或大多数编程语言中同时发生两件事情,那么请使用线程。这就是他们的目的。 Here是一个关于如何在Python中进行线程化的教程。

一个线程将切换功率,另一个将获取数据。

3

想不到任何理由我不会把它们写成两个完全独立的脚本,因为它们不需要任何状态共享。

+0

他可以制作第三个启动两个脚本! – 2012-07-11 00:25:29

+0

是的,或者只是一个简单的批处理文件/ shell脚本。 – kindall 2012-07-11 01:33:36

+0

我不确定我是否可以完成这项工作。我正在使用由其他人创建的迭代器,它做了一些我无法理解的事情。我必须严格地坚持一定的结构,否则我会从迭代器中得到错误。我很抱歉,这些陈述非常模糊,但这是我的知识水平。 – Annie 2012-07-11 02:03:57

0

asyncoro支持与协程的异步事件处理。使用asyncoro进行编程与线程非常相似,除了对异步完成使用“yield”。您的问题可以用

import asyncoro, random 

def collect(coro=None): 
    while True: 
     # collect data every 10 seconds? 
     yield coro.sleep(10) 
     data = read_data() 

def toggle(coro=None): 
    while True: 
     yield coro.sleep(random.randint(10,30)) 
     toggle_power() 

collector = asyncoro.Coro(collect) 
toggler = asyncoro.Coro(toggle) 

实现,而线程是足够的这个特殊的任务,asyncoro框架提供了许多功能,包括并行,分布式,容错的编程支持。我怀疑,鉴于问题的领域,与消息(通道或与协程的点对点通信)进行通信可能对您有用。