Python2.7 multiprocessing

    在python中,multiprocessing模块是用来管理多进程的。multiprocessing使用和threading包类似的api接口来产生多进程,multiprocessing包提供本地和远程的并发,通过使用subprocess代替threads有效的避开了GIL,由于这一点,multiprocessing模块允许程序充分的利用多处理器。

    在multiprocessing包中,通过Process对象,然后调用该对象的start()方法来创建进程。multiprocessing模块支持两种类型的进程间通讯,一种是Queues,一种是Pipes。
Queues类就像Queue.Queue的克隆,Pipe函数则返回一对连接对象,它的返回对象默认是双向的。Pipe()返回的两个连接对象代表了两个pipe,每个连接对象都有send()和recv()方法,注意,如果多个进程同时从一个pipe中读取或者写入数据,会导致pipe中的数据混乱。multiprocessing包含了和threading相同的同步原语,例如,可以通过锁来确保只有一个进程在标准输出打印。multiprocessing提供了两种办法来实现进程共享。一种是Shared memory,一种是Server process。Pool类则提供了一个进程池。

class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})

    Process对象代表它运行在一个独立的进程中,Process类有着和threading.Thread相同的方法,group总是None,它的存在是和threading.Thread保持一致,target是一个调用对象,该方法可以被run()方法唤醒,name表示进程名,args是target的元组类型的参数,kwargs是target的字典类型的参数。

Process实例的方法如下:
  run()
  start()  启动一个进程,在一个Process对象中,必须被调用至少一次,它为run()做准备
  join([timeout])  阻碍线程调用直到进程的join()方法被调用,如果timeout是Nnoe,则没有timeout  
  name  进程名称,name是一个字符串,多进程则会返回相同的名称
  is_alive()  返回进程是否存活
  daemon  进程的daemon标记,必须在start()方法之前调用。
除过以上外,Process对象还支持以下方法和属性:
  pid  返回进程id,在进程未创建前是None
  exitcode  子进程退出码,如果进程还未终止,则返回None
  authkey  进程的验证秘钥
  terminate()  终止进程,在unix中使用SIGTERM信号

multiprocessing.Pipe([duplex])

    返回一对(conn1, conn2)对象,默认duplex是True,表示返回的是双向的,表示conn1,conn2都能发送,接收消息。如果是False,则返回的是单向的,表示从conn1只能recv消息,conn2只能send消息。

class multiprocessing.Queue([maxsize])

    返回一个共享队列,对象有以下方法:
  qsize()  返回近似的队列大小,该值不可信,因为multithreading/multiprocessing是语义上的
  empty()  如果队列是空,返回True
  full()  如果队列满了,则返回True
  put(obj[, block[, timeout]])  给队列中放入一个obj,
  put_nowait(obj)  相当于put(obj, False)
  get([block[, timeout]])  删除并返回队列中的元素,
  get_nowait()  相当于get(False)

multiprocessing.queues.SimpleQueue

    返回一个简单的队列类型。只有empty()、get()、put()三种方法

class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])

    process pool对象控制pool中的哪个工作进程可以被提交,它支持异步结果,processes参数设置有多少工作进程可以被使用,如果为None,则数目为cpu_count()。如果initializer为None,则每一个进程在启动时都会调用initializer(*initargs)。maxtasksperchild表示进程在处理完多少哥任务后可以退出,并用新的工作进程代替,这样可以确保没用的资源被释放,默认为None。

有以下方法:
  apply(func[, args[, kwds]])  等同于内建的apply(),它会阻塞直到结果完成,所以在并行处理上apply_async会跟好一些。
  apply_async(func[, args[, kwds[, callback]]])  不同与apply(),它返回一个结果对象,
  map(func, iterable[, chunksize])  类似与内建map(),它会阻塞直到结果完成
  map_async(func, iterable[, chunksize[, callback]])  不同与map(),它返回一个结果对象
  imap(func, iterable[, chunksize])
  imap_unordered(func, iterable[, chunksize])
  close()  阻止向进程池中提交任务,一旦所有的任务完成,工作进程则会退出
  terminate()  立即停止工作进程,不等待工作进程完成。
  join()  等待工作进程退出,在使用join()之前必须调用close()或者terminate()

multiprocessing.active_children()

    返回当前进程的所有存活子进程

multiprocessing.cpu_count()

    返回系统的cpu数

你可能感兴趣的