我是Python的新手(以及一般的编程),所以请耐心等待。
我正在做一些实验室设备自动化,我正在寻找一种方法来在一台设备上切换电源,同时在另一台设备上获取数据。我希望这些事件彼此异步,即我希望在数据获取过程中随机切换电源。
我查看了以下内容:
-time.sleep - 我实际上能够在一次设置中成功使用它,因为电源响应很慢 - 我告诉它关闭,然后睡了一段时间,然后开始服用其他设备上的数据。这依赖于电源总是比其他设备反应慢得多,通常情况并非如此。
-multiprocessing / threading - 我在SO和python.org上一直在阅读这篇文章,但我还不清楚这是否能实现我的目标。我试图测试它,但我发现它很难编码,而且我不想在它上面投入更多的时间,如果它远不及我想要的那样。
因此,简而言之:多处理会做我想要的吗?还有其他办法吗?
答案 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框架提供了许多功能,包括支持并发,分布式,容错编程。我怀疑,鉴于问题的根源,与消息(频道或与协同程序的点对点通信)进行通信可能对您有用。