1

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

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

我检查了以下内容:

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

-multiprocessing/threading--我一直在 SO 和 python.org 上读到这个,但我仍然不清楚这是否会完成我想要的。我试图测试它,但我发现它很难编码,如果它与我想要的相去甚远,我不想在它上面投入更多时间。

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

4

4 回答 4

3

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

于 2012-07-10T23:47:32.983 回答
1

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

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

于 2012-07-10T23:37:36.237 回答
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 最佳实践并不完全清楚。

于 2012-07-10T23:46:19.747 回答
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 框架提供了许多特性,包括支持并发、分布式、容错编程。我怀疑,考虑到问题的领域,与消息(通道,或与协程的点对点通信)进行通信可能对您有用。

于 2012-07-11T17:48:21.013 回答