Python中的异步事件

时间:2012-07-10 23:21:06

标签: python

我是Python的新手(以及一般的编程),所以请耐心等待。

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

我查看了以下内容:

-time.sleep - 我实际上能够在一次设置中成功使用它,因为电源响应很慢 - 我告诉它关闭,然后睡了一段时间,然后开始服用其他设备上的数据。这依赖于电源总是比其他设备反应慢得多,通常情况并非如此。

-multiprocessing / threading - 我在SO和python.org上一直在阅读这篇文章,但我还不清楚这是否能实现我的目标。我试图测试它,但我发现它很难编码,而且我不想在它上面投入更多的时间,如果它远不及我想要的那样。

因此,简而言之:多处理会做我想要的吗?还有其他办法吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

一个线程将切换电源,另一个线程将获取数据。

答案 2 :(得分:1)

您似乎想要一个简单的Thread模型,您可以在其中为要在后台执行的任务(电源切换或数据获取)创建一个线程。这是一个例子(未经测试的代码):

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的最佳实践。

答案 3 :(得分: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框架提供了许多功能,包括支持并发,分布式,容错编程。我怀疑,鉴于问题的根源,与消息(频道或与协同程序的点对点通信)进行通信可能对您有用。