【发布时间】:2019-11-21 14:04:08
【问题描述】:
TL;DR:如果你有一个程序应该运行一段不确定的时间,当用户决定时间到时你如何编写代码来停止它? (无需 KeyboardInterrupt 或终止任务)
--
我最近发布了这个问题:How to make my code stopable? (Not killing/interrupting) 答案确实解决了我的问题,但从终止/中断的角度来看,这并不是我真正想要的。 (虽然,我的问题没有说清楚) 所以,我正在改写它。
出于示例目的,我创建了一个通用脚本。所以我有这个类,它从通用 API 收集数据并将数据写入 csv。代码通过在终端窗口输入python main.py 开始。
import time,csv
import GenericAPI
class GenericDataCollector:
def __init__(self):
self.generic_api = GenericAPI()
self.loop_control = True
def collect_data(self):
while self.loop_control: #Can this var be changed from outside of the class? (Maybe one solution)
data = self.generic_api.fetch_data() #Returns a JSON with some data
self.write_on_csv(data)
time.sleep(1)
def write_on_csv(self, data):
with open('file.csv','wt') as f:
writer = csv.writer(f)
writer.writerow(data)
def run():
obj = GenericDataCollector()
obj.collect_data()
if __name__ == "__main__":
run()
脚本应该永远运行或直到我命令它停止。我知道我可以KeyboardInterrupt (Ctrl+C) 或突然终止任务。 这不是我想要的。我想要一种“软”的方式来告诉脚本该停止了,不仅因为中断是不可预测的,而且它也是一种严厉的停止方式.
如果该脚本在 docker 容器上运行(例如),您将无法Ctrl+C,除非您碰巧在 docker 内的终端/bash 中。
或者另一种情况:如果该脚本是为客户制作的,我认为不可以告诉客户,只需使用Ctrl+C/kill 任务来停止它。绝对违反直觉,特别是如果它是非技术人员。
我正在寻找编写另一个脚本(假设这是一个可能的解决方案)的方法,该脚本将更改为False 属性obj.loop_control,一旦完成就完成循环。可以通过在(不同的)终端python stop_script.py 上键入来运行的东西。
不一定需要这样。 其他解决方案也是可以接受的,只要它不涉及 KeyboardInterrupt 或 Killing 任务。如果我可以在类中使用一个方法,那就太好了,只要我可以从另一个终端/脚本调用它。
有没有办法做到这一点?
如果您有一个程序应该运行一段不确定的时间,那么当用户决定是时候停止它时,您如何编写代码来阻止它?
【问题讨论】:
-
您可以执行类似的操作,例如让
collect_data()方法每隔一段时间检查一个特定文件是否存在,如果该文件存在,那么它将退出。所以你需要做的就是创建那个文件来停止脚本 -
相关:stackoverflow.com/questions/6920858/…。您可以使用该库让两个不同的进程进行通信。一个可以发送停止信号,另一个可以在收到停止信号时进行监听并采取相应的行动
标签: python