编写多进程程序,多进程代码

  编写多进程程序,多进程代码

  ========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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: