我试图在我的模块中为主脚本Python创建一个while
循环。有没有一种方法可以做到这一点,而不使用多处理,因为我已经看到,多处理是不可行的模块,由于Windows没有fork
支持。
因此,我尝试将while
循环放入start_capture
或measure
函数中,然后将measure
函数作为process启动(如果需要),因此它看起来像这样:
#mainScript.py
from sensorHandler import SensorHandler
sensors = SensorHandler()
sensors.start_capture()
sensors.stop_capture()
#sensorHandler.py
class SensorHandler():
def __init__ (self):
self.sensors = []
def start_capture(self):
process = Process(target=measure,args=(self.sensors,))
process.start()
def stop_capture():
process.terminate()
def measure(sensors):
while True:
#do stuff
或者像这样:
#mainScript.py
from sensorHandler import SensorHandler
sensors = SensorHandler()
sensors.start_capture()
sensors.stop_capture()
#sensorHandler.py
class SensorHandler():
def __init__ (self):
self.sensors = []
def start_capture(self):
while something:
#do stuff
def stop_capture():
something = false
但主要的一点是,当我想让它停止测量时,我想从主脚本中打破循环。任何建议或帮助将不胜感激。
2条答案
按热度按时间h9vpoimq1#
你有没有试过用break语句来退出循环?大概是这样的
这将导致您离开循环并继续执行其余代码。也可以使用
.exit()
或sys.exit()
u0njafvf2#
是的,您仍然可以在Windows中使用多处理。一般来说,您只需要确保在主脚本中,在全局范围内启动任何直接或间接执行创建子进程的语句的语句都被 Package 在
if __name__ == '__main__':
块中。建议将任何子进程初始化不需要的全局范围内的任何语句放置在这样的块中。但是,* sensorHandler.py * 还有其他问题。首先,在
stop_capture
和measure
方法中没有名为 self 的必需参数。其次,类SensorHandler
中的self.sensors
是一个常规的list
示例(可能命名不当)。当创建子进程并假定将其追加到该列表时,它是对SensorHandler
示例的副本执行此操作,该副本驻留在为子进程创建的新地址空间中。因此,按照当前的编码,主程序没有办法检索这个列表。一个解决方案是使用一个 * 托管列表 *,它可以跨进程共享。但是要注意,这个列表上的每个操作都比使用常规列表要慢。因此,我会让主进程创建托管列表,并使用它来示例化SensorHandler
示例,如下所示:在你的例子中,mainScript.py 看起来像:
然后我将 sensorHandler.py 编码如下:
打印(几秒钟后终止):
请注意,我已经将属性
sensors
重命名为measurements
,因为您可能会在此列表中添加传感器读数或测量值,而不是传感器。