• 线程


     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,比如有以下的需求,一个子进程向队列中写数据,另一个进程从队列中取数据  

  • 相关阅读:
    Mybatis专栏文章整理成册《Mybatis进阶》!!!
    Mybatis的几种传参方式,你了解吗?
    HDU 1890
    POJ 2186
    HDU 2896
    POJ 1322
    POJ 1276
    POJ 1208
    POJ 1189
    POJ 1178
  • 原文地址:https://www.cnblogs.com/yingqml/p/6223957.html
Copyright © 2020-2023  润新知