Python中的异步事件

Python中的异步事件,python,Python,我是Python新手(一般来说也是编程新手),所以请耐心等待 我正在做一些实验室设备自动化,我正在寻找一种方法,在一台设备上切换电源,同时在另一台设备上采集数据。我希望这些事件彼此异步,也就是说,我希望在数据采集过程中随机切换电源 我已经检查了以下内容: -time.sleep——我实际上能够在一个设置中成功地使用它,因为电源响应太慢了——我让它关机,然后随机睡眠一段时间,然后开始在其他设备上采集数据。这取决于电源的反应总是比其他设备慢得多,通常情况并非如此 -多处理/线程——我已经在SO和py

我是Python新手(一般来说也是编程新手),所以请耐心等待

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

我已经检查了以下内容:

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

-多处理/线程——我已经在SO和python.org上读到了这方面的内容,但我仍然不清楚这是否能实现我想要的。我试着测试它,但我发现很难编写代码,如果它离我想要的还远的话,我不想在上面投入更多的时间


简单地说,多重处理能满足我的要求吗?还有其他方法吗?

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


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

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


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

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


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

似乎您需要一个简单的线程模型,在该模型中,您可以为希望在后台执行的任务创建一个线程(电源切换或数据采集)。下面是一个示例(未经测试的代码):


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

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

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

支持使用协程进行异步事件处理。使用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框架提供了许多特性,包括对并发、分布式、容错编程的支持。我怀疑,考虑到问题的领域,与消息通信(通道或与协同路由的点对点通信)可能对您有用。

支持与协同路由的异步事件处理。使用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框架提供了许多特性,包括对并发、分布式、容错编程的支持。我怀疑,考虑到问题的领域,与消息(通道或与协同程序的点对点通信)通信可能对您有用。

您可以看看Twisted:Twisted很酷,但从事物的声音来看,一个简单的线程应该很好。您没有说任何关于正在进行的通信的内容(http、套接字、其他内容?)。这可能会影响您的解决方案。仅使用标准线程就可以了。。。不需要任何幻想你可能会喜欢这本书:等待吉尔巨魔。线程或单独的进程就可以完成这项任务。你可以看看Twisted:Twisted很酷,但从事物的声音来看,一个简单的线程就可以了。您没有说任何关于正在进行的通信的内容(http、套接字、其他内容?)。这可能会影响您的解决方案。仅使用标准线程就可以了。。。不需要任何幻想你可能会喜欢这本书:等待吉尔巨魔。线程或单独的进程就可以完成此任务。他可以制作第三个线程来启动这两个脚本!是的,或者只是一个简单的批处理文件/shell脚本。我不确定我是否能做到这一点。我正在使用由其他人创建的迭代器,它所做的事情我还远远不了解。我必须严格遵守某个结构,否则我会从迭代器中得到错误。很抱歉,这些陈述太模糊了,但这是我所知的范围。他可以制作第三个,启动两个脚本!是的,或者只是一个简单的批处理文件/shell脚本。我不确定我是否能做到这一点。我正在使用由其他人创建的迭代器,它所做的事情我还远远不了解。我必须严格遵守某个结构,否则我会从迭代器中得到错误。很抱歉,这些陈述很模糊,但这是我所知的范围。