Python 多进程问题

2020-12-02 14:09:48 +08:00
 frmongo

在一个 linux 主机上,我想同时开始播放音乐和录音(有麦克风),期望录音结束,音乐自动停止。 现在只需要录音 20 秒,下面的代码录音结束后,音乐不会停止,怎么写可以实现目的呢

# coding:utf-8

from multiprocessing import Process as process
import os

def play_music():
    cmd1 = "aplay muisc.wav"
    os.system(cmd1)

def record():
    cmd1 = "arecord -r 16000 -t wav -d 20 -v out.wav"
    os.system(cmd1)

if __name__ == '__main__':
    
    p1 = process(target=play_music)
    p1.daemon=True
    p1.start()
    record()
    p1.terminate()
    p1.join()
2053 次点击
所在节点    Python
9 条回复
ruanimal
2020-12-02 14:16:02 +08:00
直接用 subprocess.popen 就好了啊,用啥 multiprocessing 。。。
jkhere
2020-12-02 15:27:49 +08:00
不是很好实现,子进程开始执行后,主进程就无法精确控制子进程了。
假设你子进程开始后,主进程开始计时,到时间后杀死子进程,这样也只是粗略的控制时间。
mingl0280
2020-12-02 15:48:26 +08:00
先开始放音乐,再启动录音,录音返回以后( system 有返回值吧) kill 掉放音……
ysc3839
2020-12-02 15:56:21 +08:00
@ruanimal 我也觉得应该直接使用 subprocess.popen 。play_music 就只是调用 shell 启动个新进程,不如直接自己启动新进程,没必要绕一圈。
ruanimal
2020-12-02 16:38:30 +08:00
@ysc3839 意思是用 subprocess.popen 替换 multiprocessing 和 os.system
ysc3839
2020-12-02 17:17:35 +08:00
@ruanimal 是的,我就是想表达这个意思。
NeezerGu
2020-12-02 17:18:20 +08:00
jkhere
2020-12-04 17:31:15 +08:00
给你个 demo,用 python 的协程吧:

import asyncio

async def eternity():
# do your job
while True:
print('doing!')

async def main():
# Wait for at most 20 second
try:
await asyncio.wait_for(eternity(), timeout=20.0)
except asyncio.TimeoutError:
print('timeout! job done')

asyncio.run(main())
jkhere
2020-12-04 17:32:38 +08:00
```python
import asyncio

async def eternity():
# do your job
while True:
print('doing!')

async def main():
# Wait for at most 20 second
try:
await asyncio.wait_for(eternity(), timeout=20.0)
except asyncio.TimeoutError:
print('timeout! job done')

asyncio.run(main())
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX