python 读书笔记 (十二) 进程通信

21.1 subprocess

执行程序,获取返回码或输出信息。
• call: 返回 ExitCode。
• check_call: 如果 ExitCode != 0,抛出 CalledProcessError 异常。
• check_output: 返回输出信息。ExitCode != 0 抛出异常。
命令行行参数可以用 shlex.split 分解成列表

>>> from subprocess import *
>>> from shlex import split
>>> 
>>> s = check_output(split('ls -l'))
>>> print(s)
b'\xe6\x80\xbb\xe7\x94\xa8\xe9\x87\x8f 28\n-rw-rw-r-- 1 sun sun 23153 6\xe6\x9c\x88   8 15:03 maoyan.txt\ndrwxrwxr-x 3 sun sun  4096 6\xe6\x9c\x88  22 07:23 spider\n'
>>> from subprocess import Popen, PIPE
>>> Popen('find . -name "*.txt" | xargs ls -l', shell=True).wait()
-rw-rw-r-- 1 sun sun 23153 6月   8 15:03 ./maoyan.txt
0
>>> p = Popen('find . -name "*.txt" | xargs ls -l', shell=True, stdout=PIPE) # 使用PIPE改变输出对象
>>> p.pid
24542
>>> print(p.stdout.read())
b'-rw-rw-r-- 1 sun sun 23153 6\xe6\x9c\x88   8 15:03 ./maoyan.txt\n'
>>> p.wait()
0

22.2 signal

信号是软中断,提供了一种异步事件通知机制,python默认已经安装了一些信号处理器,比如SIGPIPE被忽略,SIGINT引发Keyboardinterrupt异常, 捕获SIGTERM调用退出函数

常用信号
• SIGINT: 用户中断 (ctrl + c)。
• SIGTERM: 由 kill() 发送,进程终止。
• SIGCHLD: 子进程终止。
• SIGHUP: 终端会话终止。
• SIGSTP: 进程暂停 (ctrl + z)。
• SIGALRM: 告警。

注意:信号SIGKILL,SIGSTOP不能被捕获

signal


仅能在主线程调用 signal() 注册信号处理器函数,它会移除当前处理动作。可用用 getsignal() 获
取,在需要时重新注册。有两个特殊的处理器:SIG_IGN 忽略信号,SIG_DFL 默认处理。

from signal import *
from time import time, sleep


def sig_handler(signum, frame):
    print('KeyboardInterrupt')
    exit(0)

def main():
    signal(SIGINT, sig_handler)
    while True:
        sleep(1)
        print(time())
if __name__ == '__main__':
    main()
# 1498090322.9949114
# 1498090323.9951088
# 1498090324.9962428
# KeyboardInterrupt

中断信号被拦截,我们可以自主决定是否终止进程. 在 GDB 里,用 SIGINT 来处理调试中断。也有
一些软件用 SIGUSR1、SIGUSR2 作为外部通知事件,比如重启什么的。信号处理会被带入fork()
创建的子进程

pause
函数 pause() 会使进程休眠,直到进程接收到信号。信号要么被处理,要么终止进程

from signal import *
from time import  time
def sig_handler(signum, frame):
    print('sig:', signum)

def main():
    signal(SIGUSR1, sig_handler)

    while True:
        print(time())
        pause()
if __name__ == '__main__':
    main()

如果收到 SIGUSR1 信号, 则进程苏醒后显示时间, 然后再次休眠,如果是其他信号,进程终止

alarm
在 n 秒后发送一个 SIGALRM 告警信号。或用 0 秒取消所有尚未到期的告警

signal(SIGALRM, sig_alarm)  # 捕获信号
alarm(2)                   # 2s后发送警告信号, 仅一次

timer

用来设置在 seconds 秒后发出信号,并在此以后每隔 interval 秒重复发出信号。参数 which 决定
了发出何种信号

• ITIMER_REAL: SIGALRM
• ITIMER_VIRTUAL: SIGVTALRM
• ITIMER_PROF: SIGPROF

将 seconds 设置为 0,将清除定时器

 

23.2 shlex


shlex 是一个分割 Unix Shell 命令行参数的简单词法分析器。

>>> split("ls -l /usr/local")
['ls', '-l', '/usr/local']

 

转载于:https://my.oschina.net/acutesun/blog/994971

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值