线程

 Queue是python中的标准库,可以直接import引入。就是著名的“先吃先拉”和后吃后吐,可以定义它的容量,别吃撑了,吃多了,就会报错,构造的时候不写或者写个小于1的数则表示无限多

import Queue

q=Queue.Queue(10)

向队列中放值put

q.put("yang")

q.put(4)

在队列中取值是get,默认的队列是先进先出的

q.get()

"yang"

当一个队列为空的时候,如果再用get取值则会堵塞,所以取队列的时候一般是用到get_nowait()方法,这种方法在向一个空队列取值的时候,会抛出一个Empty异常,所以更常用 方法是先判断队列是否为空,如果不为空,则取值。队列中常用的方法:

Queue.qsize()返回队列的大小

Queue.empty()如果队列为空,返回True,反之返回False

Queue.full()如果队列满了,返回True,反之False

Queue.get([block[,timeout]])获取队列,timeout等待时间

Queue.get_nowait()相当于Queue.get(False)

非阻塞Queue.put(item)写入队列 ,timeout等待时间

Queue.put_nowait(item)相当Queue.put(item,False)

二、multiprocessing中使用子进程概念

from multiprocessing import Process

可以通过process来构造一个子进程

p=process(target=fun,args=(args))

再通过start()来启动子进程

再通过p.join()方法来使得子进程运行结束后再执行父进程

eg:from multiprocessing import process

import os

#子进程要执行的代码

def run_proc(name):

  print "...."%(name,os.getpid())

if __name__=='__main__':

  print 'parent process %s'%os.getpid()

  p=Process(target=run_proc,args=('test',))

  print 'process will start'

  p.start()

  p.join()

  print process end'

三、在multiprocessing中使用pool

如果需要多个子进程时,可以考虑使用进程池(pool)来管理

from multiprocessing import pool

import os,time

def long_time_task(name):

  print ''run task %(%s)%(name,os.getpid())

  start = time.time()

  time.sleep(3)

  end=time.time()

  print 'task %s runs%0.2f seconds'%(name,end-start)

if __name__ =='__main__':

  print 'parent process %s'%os.getpid()

  p = pool()

  for i in range(5):

    p.apply_async(long_time_task,args=(i,))

  print 'waiting for all subprocess donw'

  p.close()

  p.join()

  print 'all subprocess done'  

pool创建子进程的方法与process不同,是通过p.apply_async(func,args=(args,)实现,一个池子里能同时运行的任务数取决你的电脑的cpu的数量,如果电脑里面现在是有4个cpu,那么子进程task0,task1,task2,task3可以同时启动,task4则在之前的一个某个进程结束后才开始。

代码中的p.close()是关掉进程池子,是不再向里面添加进程了,对pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close之后就不能继续添加新的process了

也可以在实例化pool的时候给他定义一个进程的多少,如果上面的代码是p=pool(5),那么所有的子进程就可以同时进程

四。多个子进程之间的通信

多个子进程间的通信就要采用第一步说道的Queue,比如有以下的需求,一个子进程向队列中写数据,另一个进程从队列中取数据  

原文地址:https://www.cnblogs.com/yingqml/p/6223957.html