我正在尝试在功能运行时点亮5mm LED。当这个函数(下面有关于此的更多细节)完成并返回一个值时,我想打破while循环。
while循环的当前代码:
pins = [3,5,8,15,16]
def piBoard():
finished = 0
while finished!=10:
for pin in pins
GPIO.output(
pin, GPIO.HIGH
)
time.sleep(0.1)
GPIO.output(
pin, GPIO.LOW
)
finished+=1
现在在上面的例子中我只运行while循环,直到count等于10,而不是最佳实践。如果我的下一个函数返回了值,我希望while循环中断。
功能我希望在返回其值时打破我的while循环
def myFunction():
Thread(target = piBoard().start()
// Trying to recognize the song
return the song which is recognized
谢谢, - K。
答案 0 :(得分:1)
在我看来,您希望编写一个扩展Thread
并实现__enter__
和__exit__
方法的类,以使其在with
语句中起作用。易于实现,语法简单,效果很好。该课程将如下所示:
import threading
class Blinky(threading.Thread):
def __init__(self):
super().__init__()
self.daemon = True
self._finished = False
def __enter__(self):
self.start()
def __exit__(self, exc_type, exc_val, exc_tb):
self.stop()
def run(self):
# turn light on
while not self._finished:
time.sleep(.5)
# turn light off
def stop(self):
self._finished = True
然后,要运行您的功能,您只需输入:
with Blinky():
my_function()
一旦达到with
语句,指示灯应亮起,并在退出with
的上下文后关闭半秒钟。
答案 1 :(得分:0)
在while条件设置为true并且在while循环中放置if语句将检查函数是否返回任何值,如果返回写入中断
答案 2 :(得分:0)
如果您愿意使用线程。 你可以通过使用线程来实现这一点。 这是示例代码
`$ 60 :List of 1
..$ results:'data.frame': 1 obs. of 5 variables:
.. ..$ address_components:List of 1
.. .. ..$ :'data.frame': 8 obs. of 3 variables:
.. .. .. ..$ long_name : chr [1:8] "119" "Avenida Diego Díaz de Berlanga"
"Jardines de Anahuac 2do Sector" "San Nicolás de los Garza" ...
.. .. .. ..$ short_name: chr [1:8] "119" "Avenida Diego Díaz de Berlanga"
"Jardines de Anahuac 2do Sector" "San Nicolás de los Garza" ...
.. .. .. ..$ types :List of 8
.. .. .. .. ..$ : chr "street_number"
.. .. .. .. ..$ : chr "route"
.. .. .. .. ..$ : chr [1:3] "political" "sublocality" "sublocality_level_1"
.. .. .. .. ..$ : chr [1:2] "locality" "political"
.. .. .. .. ..$ : chr [1:2] "administrative_area_level_2" "political"
.. .. .. .. ..$ : chr [1:2] "administrative_area_level_1" "political"
.. .. .. .. ..$ : chr [1:2] "country" "political"
.. .. .. .. ..$ : chr "postal_code"
.. ..$ formatted_address : chr "Avenida Diego Díaz de Berlanga 119, Jardines
de Anahuac 2do Sector, 66444 San Nicolás de los Garza, N.L., Mexico"
.. ..$ geometry :'data.frame': 1 obs. of 3 variables:
.. .. ..$ location :'data.frame': 1 obs. of 2 variables:
.. .. .. ..$ lat: num 25.7
.. .. .. ..$ lng: num -100
.. .. ..$ location_type: chr "ROOFTOP"
.. .. ..$ viewport :'data.frame': 1 obs. of 2 variables:
.. .. .. ..$ northeast:'data.frame': 1 obs. of 2 variables:
.. .. .. .. ..$ lat: num 25.7
.. .. .. .. ..$ lng: num -100
.. .. .. ..$ southwest:'data.frame': 1 obs. of 2 variables:
.. .. .. .. ..$ lat: num 25.7
.. .. .. .. ..$ lng: num -100
.. ..$ place_id : chr "ChIJRY_wPdqUYoYRTJetT6AJETA"
.. ..$ types :List of 1
.. .. ..$ : chr "street_address"
希望这有帮助。
答案 3 :(得分:0)
您需要某种线程间通信。 threading.Event
就像你能得到的一样简单。
import threading
song_recognized_event = threading.event()
在您的歌曲识别器中,一旦识别出歌曲,请拨打set()
。
在LED循环中,在切换LED时偶尔检查isSet()
。
while not song_recognized_event.isSet():
# toggle LEDs
运行clear()
重置它。
答案 4 :(得分:0)
使用装饰者和asyncio,灵感来自@Eric Ed Lohmar:
import asyncio
def Blink():
from functools import wraps
async def _blink():
while True:
print("OFF")
await asyncio.sleep(.5)
print("ON")
await asyncio.sleep(.5)
def Blink_decorator(func):
@wraps(func)
async def wrapper(*args,**kwargs):
asyncio.ensure_future(_blink())
await func(*args,**kwargs)
return wrapper
return Blink_decorator
@Blink()
async def longTask():
print("Mission Start")
await asyncio.sleep(3)
print("Mission End")
def main():
loop = asyncio.get_event_loop()
loop.run_until_complete(longTask())