Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3344字,纯文字阅读大概需要5分钟。
内容图文
我有个简单的应用需求:
1. 该应用随时会监听键盘的输入;
2. 当输入指定键时会控制相机录制的启动和关闭。
监听键盘是一个事件循环,相机录制也是一个循环录制的过程。我试着用 Python 启动两个进程,并用两个进程共享变量的更新来控制两个进程的交互。
监听键盘输入
首先我找到python 监听键盘输入的方案可以满足我监听键盘的需求。
1 import sys, select, tty, termios 2 3 old_attr = termios.tcgetattr(sys.stdin) 4tty.setcbreak(sys.stdin.fileno()) 5print(‘Please input keys, press Ctrl + C to quit‘) 6 7while(1): 8if select.select([sys.stdin], [], [], 0)[0] == [sys.stdin]: 9print(sys.stdin.read(1)) 1011 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_attr)
这段代码可以进行键盘监听,但是却有一个潜在 Bug:第 11 行的代码永远无法执行,即使加上跳出循环的判断,当使用 Ctrl+C 时程序会终止。
而第 11 行的作用是恢复当前终端的原始属性,没执行到该语句,终端会变得不正常:你会发现程序结束后在该终端输入字符不会有显示。因此,程序应该设法程序终止时必然执行该语句。
我建议改为类似的代码来修复这个 Bug:
1 import sys 2 import select 3 import tty 4 import termios 5 6 old_attr = termios.tcgetattr(sys.stdin) 7tty.setcbreak(sys.stdin.fileno()) 8print(‘Please input keys, press Ctrl + C to quit‘) 910try: 11while True: 12if select.select([sys.stdin], [], [], 0)[0] == [sys.stdin]: 13 key = sys.stdin.read(1) 14if key == ‘q‘: 15# to stop the infinite loop16break17elif key == ‘s‘: 18# do something19print(‘I will do something‘) 20else: 21# do other things22print(key) 2324except Exception as e: 25print(e) 26finally: 27 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_attr)
相机录制
相机录制的路径当然因不同的相机而异,因此这里我只写 Demo 级别的抽象代码:
1 import time 2 3 4 class Recorder: 5 def __init__ (self): 6 print(‘Recorder initialization.‘) 7 8def run(self): 9 time.sleep(0.3) 10print(‘Recording a frame.‘) 1112def close(self): 13print(‘Recording ended.‘) 141516 recorder = Recorder() 1718 t0 = time.time() 19while time.time() - t0 < 10: 20 recorder.run() 2122 recorder.close()
可以看到这段逻辑也有一个条件循环。
假设应用的需求是按键 s,进行录制;再次按键 s,终止录制。
由于这两个逻辑需要完全同时进行,而 Python 的线程又是伪并行,因此这里考虑用多进程共享变量的通信。
使用进程间共享变量
使用 multiprocessing,直接看完整的代码是比较直观的:
1 import time 2 import sys 3 import select 4 import tty 5 import termios 6 import multiprocessing 7 8 9 class Recorder: 10 def __init__ (self): 11 print(‘Recorder initialization.‘) 1213def run(self): 14 time.sleep(0.3) 15print(‘Recording a frame.‘) 1617def close(self): 18print(‘Recording ended.‘) 192021def recording_process(shared): 22 recorder = Recorder() 23while shared[‘is_recording‘]: 24 recorder.run() 2526 recorder.close() 272829if__name__ == ‘__main__‘: 30# set shared variable31 manager = multiprocessing.Manager() 32 shared = manager.dict() 33 shared[‘is_recording‘] = False 3435 old_attr = termios.tcgetattr(sys.stdin) 36 tty.setcbreak(sys.stdin.fileno()) 37print(‘Please input keys, press Ctrl + C to quit‘) 3839# check the keyborad40 p = None 41try: 42while True: 43if select.select([sys.stdin], [], [], 0)[0] == [sys.stdin]: 44 key = sys.stdin.read(1) 45if key == ‘q‘: 46# to stop the infinite loop47break48elif key == ‘s‘: 49# toggle50 shared[‘is_recording‘] = not shared[‘is_recording‘] 51# resume or stop recording52if shared[‘is_recording‘]: 53 p = multiprocessing.Process(target=recording_process, args=(shared,)) 54 p.start() 55else: 56 p and p.join() 57else: 58# do other things59print(key) 6061except Exception as e: 62print(e) 63finally: 64 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_attr)
原文作者:雨先生
原文链接:https://www.cnblogs.com/noluye/p/11704982.html
许可协议:知识共享署名-非商业性使用 4.0 国际许可协议
参考
原文:https://www.cnblogs.com/noluye/p/11704982.html
内容总结
以上是互联网集市为您收集整理的Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互全部内容,希望文章能够帮你解决Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。