python 如何从主脚本中打破模块中的无限循环?

2vuwiymt  于 2023-06-20  发布在  Python
关注(0)|答案(2)|浏览(135)

我试图在我的模块中为主脚本Python创建一个while循环。有没有一种方法可以做到这一点,而不使用多处理,因为我已经看到,多处理是不可行的模块,由于Windows没有fork支持。
因此,我尝试将while循环放入start_capturemeasure函数中,然后将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

但主要的一点是,当我想让它停止测量时,我想从主脚本中打破循环。任何建议或帮助将不胜感激。

h9vpoimq

h9vpoimq1#

你有没有试过用break语句来退出循环?大概是这样的

while True:
    #do stuff
    break

这将导致您离开循环并继续执行其余代码。也可以使用.exit()sys.exit()

u0njafvf

u0njafvf2#

是的,您仍然可以在Windows中使用多处理。一般来说,您只需要确保在主脚本中,在全局范围内启动任何直接或间接执行创建子进程的语句的语句都被 Package 在if __name__ == '__main__':块中。建议将任何子进程初始化不需要的全局范围内的任何语句放置在这样的块中。
但是,* sensorHandler.py * 还有其他问题。首先,在stop_capturemeasure方法中没有名为 self 的必需参数。其次,类SensorHandler中的self.sensors是一个常规的list示例(可能命名不当)。当创建子进程并假定将其追加到该列表时,它是对SensorHandler示例的副本执行此操作,该副本驻留在为子进程创建的新地址空间中。因此,按照当前的编码,主程序没有办法检索这个列表。一个解决方案是使用一个 * 托管列表 *,它可以跨进程共享。但是要注意,这个列表上的每个操作都比使用常规列表要慢。因此,我会让主进程创建托管列表,并使用它来示例化SensorHandler示例,如下所示:
在你的例子中,mainScript.py 看起来像:

if __name__ == '__main__':
    from sensorHandler import SensorHandler
    from multiprocessing import Manager

    with Manager() as manager:
        measurements = manager.list()
        sensor_handler = SensorHandler(measurements)
        sensor_handler.start_capture()
        input('Hit enter to stop capturing... ')
        sensor_handler.stop_capture()
        print(measurements)

然后我将 sensorHandler.py 编码如下:

from multiprocessing import Process
import time

class SensorHandler():
    def __init__ (self, measurements):
        self.measurements = measurements

    def start_capture(self):
        self.process = Process(target=self.measure)
        self.process.start()

    def stop_capture(self):
        self.process.terminate()

    def measure(self):
        for i in range(100):
            self.measurements.append(i)
            time.sleep(1)

打印(几秒钟后终止):

[0, 1, 2]

请注意,我已经将属性sensors重命名为measurements,因为您可能会在此列表中添加传感器读数或测量值,而不是传感器。

相关问题