编写多进程程序,多进程代码
========Python开发技术详解
os.system中的子进程会将控制权交还给python在它完成之后;
Os.exec将接管python进程,不会将控制权交还给python。如果在python中调用exec打开记事本,原始的python解释器将会退出。
退出可以用温和的方式退出进程;
中止将会猛烈地退出进程。
///////////////////
作为流程管理的高级模块,子流程提供了一个类和两个函数来管理流程。
subprocess.popen中的Shell:当shell为false时,popen会调用os.execvp执行相应的程序。但当shell为真时,如果命令是字符串,popen直接调用系统shell执行指定的程序。
如果命令是序列,第一项是命令字符串,其他项是命令的附加参数。
如果需要等待子进程结束,可以使用popen类的wait()函数。
如果需要管理子进程的输入输出,可以更改popen类的stdin、stdout、stderr。
输出结果后,stdout成为一个可读的输出对象。
因为数据缓存在内存中,所以当有大量数据时不要使用communicate。
Call和check_all子流程是popen的简化。call可以直接生成子流程,等待子流程结束。check_all和call的区别在于,如果返回值不为0,会触发异常CallProcessError,异常对象的returncode属性中有返回值。
信号是操作系统的软中断。当信号和线程同时使用时,信号函数总是在主线程中执行,所以信号不能作为线程间的通信方式。
信号模块不是用python实现的,而是直接依赖于具体的系统平台,所以信号模块只包含系统中定义的信号。
信号.signal()的作用是不间断地注册指定的信号处理功能。
信号模块有两个预设的信号处理功能:SIG_DFL和SIG _ IGN[默认处理功能和忽略信号]
的自定义处理程序应包含两个参数:信号编号和当前堆栈帧:def signal_handler(signum,fram):
信号模块提供了查询特定信号处理函数的方法:getsignal,返回值是可调用的python对象,或者SIG_IGN,SIG_DFL,None。
当程序在IO操作过程中收到信号中断时,可能会在信号处理函数执行后触发异常,或者直接触发异常。
当信号和线程同时使用时,信号函数总是在主线程中执行,所以信号不能作为线程间的通信方式。
=======多线程
队列是多线程安全的,通常用于线程间通信。它的构造函数可以指定一个maxsize。如果maxsize小于或等于0,则意味着队列长度没有限制。当大于0时,指定队列的长度;
队列最重要的方法是put和get,而其他方法的返回值由于多线程的原因不一定准确,比如qsize和empty。
对于一个线程,start方法最多只能调用一次,join方法可以调用多次;
为了让主线程等待子线程,需要在主线程中调用子线程的join方法;线程不能在自己运行的代码中调用join,否则会造成死锁。
join方法可以接收一个时间参数作为超时。
线程中的局部变量:treading.local,其成员变量在每个线程中是不同的。
======同步
四种线程同步机制:锁;条件变量;旗语;同步队列
条件变量条件:除了获取和释放,还有wait、nofity和notifyAll。
notifyAll和notify的区别:notifyall可以唤醒所有等待这个条件的线程。
wait方法或nofity方法的调用是在获取互斥体的前提下进行的。
=====从下图来看,条件变量的获取和释放也是成对出现的。全局创建一个条件变量,然后将其传递给生产者和消费者。
信号量:主要用于同步“有限”的资源。当构造信号量对象时,指定资源的数量,比如Semaphore(5)。
还有获取和释放信号量。执行acquire时,如果内部计数器大于0,则减1,程序继续向下执行。如果内部计数器等于0,当前线程将被阻塞,直到其他线程使用release方法。release方法递增计数器并唤醒等待线程。
来自博主的原创作品和你的没什么区别。转载请联系作者取得授权,否则追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。