我是靠谱客的博主 等待曲奇,最近开发中收集的这篇文章主要介绍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'xe6x80xbbxe7x94xa8xe9x87x8f 28n-rw-rw-r-- 1 sun sun 23153 6xe6x9cx88   8 15:03 maoyan.txtndrwxrwxr-x 3 sun sun  4096 6xe6x9cx88  22 07:23 spidern'
>>> 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 6xe6x9cx88   8 15:03 ./maoyan.txtn'
>>> 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

最后

以上就是等待曲奇为你收集整理的python 读书笔记 (十二) 进程通信的全部内容,希望文章能够帮你解决python 读书笔记 (十二) 进程通信所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部