IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]14.2 multiprocessing--多线程

    caimouse发表于 2016-07-01 09:38:04
    love 0

    本模块提供了多进程进行共同协同工作的功能。由于Python存在GIL锁,对于多线程来说,这只是部分代码可以使用多CPU的优势,对于想全部使用多CPU的性能,让每一个任务都充分地使用CPU,那么使用多进程就是达到此目的,因为每个进程在Python里单独的GIL锁,这样就不会在不同进程之间进行了阻塞。因此,如果是需要使用大量CPU计算资源的需要,就应该使用多进程的方式。

     

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

    创建一个多进程管理对象,它就像多线程管理类Thread是一样的。参数group是总是为None,为了兼容线程类;参数target是被run()调用的可调用对象;参数name是进程的名称;参数args是target对象的参数;参数kwargs是target对象的参数;参数daemon是是否设置为守护进程,守护进程不关心父进程是否退出的进程。

     

    run()

    进程运行的主函数。

     

    start()

    启动进程。

     

    join([timeout])

    阻塞直到进程退出为止,如果有设置超时时间就到达超时时间或者进程退出就返回。

     

    name

    进程的名称。

     

    is_alive()

    返回进程是否运行中,如果是返回True。

     

    daemon

    守护进程的标志。

     

    pid

    返回当前进程的ID。

     

    exitcode

    返回进程退出码。

     

    authkey

    进程的授权键值。

     

    sentinel

    数字表示的句柄。可以使用在系统等待函数里。

     

    terminate()

    终止进程。

     

    exception multiprocessing.ProcessError

    多进程的基本异常。

     

    exception multiprocessing.BufferTooShort

    接收缓冲区太小时异常。

     

    exception multiprocessing.AuthenticationError

    授权异常。

     

    exception multiprocessing.TimeoutError

    超时异常。

     

    multiprocessing.Pipe([duplex])

    两个进程之间的通讯的管道对象。参数duplex是设置为True时表示双向通讯。

     

    class multiprocessing.Queue([maxsize])

    多个进程之间进通讯的队列。它与管道的区别是可以多个进程之间进行通讯,管道只能是两个进程之间进行通讯。

    qsize()

    返回队列的大小。

     

    empty()

    如果队列为空返回True。

     

    full()

    如果队列已经满返回True。

     

    put(obj[, block[, timeout]])

    把对象obj放入队列。如果参数block为True,而参数timeout是None,直到放入成功本函数调用才返回。

     

    put_nowait(obj)

    把对象obj放入队列,不作等待,相当于put(obj, False)。

     

    close()

    当前进程关闭列表,不再放入任何数据到队列。

     

    join_thread()

    加入后台线程方式,以便等所有数据从队列里发送出去再退出进程。

     

    cancel_join_thread()

    防止后台线程阻塞,取消阻塞方式退出进程。

     

    class multiprocessing.SimpleQueue

    简化的队列,与类Pipe比较类似。

    empty()

    当队列为空返回True。

     

    get()

    从队列里删除,并返回删除的项。

     

    put(item)

    把一项对象放入到队列。

     

    class multiprocessing.JoinableQueue([maxsize])

    队列的派生类,添加了两个新的方法。

    task_done()

    当使用get()函数获取任务已经做完了,可以调用本函数来通知队列任务已经做完。

     

    join()

    当队列里所有项未曾被处理之前,一直阻塞。

     

    multiprocessing.active_children()

    返回当前进程所有活动子进程列表。

     

    multiprocessing.cpu_count()

    返回当前系统有多少个CPU。

     

    multiprocessing.current_process()

    返回当前进程对应的Process对象。

     

    multiprocessing.freeze_support()

    支持打包到Windows的EXE文件。

     

    multiprocessing.get_all_start_methods()

    返回当前平台所支持的创建进程的方式列表。

     

    multiprocessing.get_context(method=None)

    返回多进程里的环境变量。

     

    multiprocessing.get_start_method(allow_none=False)

    返回启动进程的方式,比如fork,spawn,forkserver或None。

     

    multiprocessing.set_executable()

    设置子进程所使用解析器的路径。比如set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))。

     

    multiprocessing.set_start_method(method)

    设置启动子进程的方式。

     

    多进程运行的例子:

    #python 3.4
    from multiprocessing import Process, Queue
     
    def f(q, name):
        q.put(['hello', name])
     
    if __name__ == '__main__':
        print('start...')
        q = Queue()
        p = Process(target=f, args=(q,'blog.csdn.net/caimouse',))
        p.start()
        print(q.get())
        p.join()
        print('gone')


    结果输出如下:

    start...

    ['hello', 'blog.csdn.net/caimouse']

    gone

     

    多进程使用管道通讯的例子:

    #python 3.4

    from multiprocessing import Process, Pipe

     

    def f(conn):

        conn.send([42, None, 'hello'])

        conn.close()

     

    if __name__ == '__main__':

        parent_conn, child_conn = Pipe()

        p = Process(target=f, args=(child_conn,))

        p.start()

        print(parent_conn.recv())   # prints "[42, None, 'hello']"

        p.join()

    结果输出如下:

    [42, None, 'hello']



    蔡军生  QQ:9073204 深圳



沪ICP备19023445号-2号
友情链接