• python(32):多进程(2) multiprocessing


    python 多线程:多线程

    由于Python设计的限制(我说的是咱们常用的CPython)。最多只能用满1个CPU核心。
    Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。

    1、新建单一进程

    如果我们新建少量进程,可以如下:

    import multiprocessing
    import time
    def func(msg):
      for i in xrange(3):
        print msg
        time.sleep(1)
    if __name__ == "__main__":
      p = multiprocessing.Process(target=func, args=("hello", ))
      p.start()
      p.join()
      print "Sub-process done."

    2、使用进程池

    是的,你没有看错,不是线程池。它可以让你跑满多核CPU,而且使用方法非常简单。

    注意要用apply_async,如果落下async,就变成阻塞版本了。

    processes=10是最多并发进程数量。代码如下,能同时看到10个文件在同时进行写入。

    # /usr/bin/env python
    # coding=utf8
    import multiprocessing
    import time
    path = "C:\Users\admin.95BNQ4GMHNOZBFR\Desktop\linshi\test\"
    num = 0
    def func(msg,k):
        print msg
        # for i in xrange(3):
        for j in range(5000):
            ff = open(path + str(k) + ".txt","a")
            ff.write("mmmmm" + "
    ")
            ff.close()
        # time.sleep()
    if __name__ == "__main__":
      pool = multiprocessing.Pool(processes=10) #同时跑十个进程
      for i in xrange(100):  #先把这100个跑完,然后每次跑其中的十个
          msg = "hello %d" % (i)
          print msg + "---"
          pool.apply_async(func, (msg,i))
      pool.close()
      pool.join()
      print "Sub-process done."

     运行结果:可以看出把100个任务送进进程池中,然后每次从中取10个

    3、使用Pool,并需要关注结果

    更多的时候,我们不仅需要多进程执行,还需要关注每个进程的执行结果,如下:

    # /usr/bin/env python
    # coding=utf8
    import multiprocessing
    import time
    
    path = "C:\Users\admin.95BNQ4GMHNOZBFR\Desktop\linshi\test\"
    num = 0
    
    def func(msg, k):
        print "||" + msg
        # for i in xrange(3):
        for j in range(3000):
            ff = open(path + str(k) + ".txt", "a")
            ff.write("mmmmm" + "
    ")
            ff.close()
        return "the " + str(k) + " have done"   # 返回已经完成的状态
    
    
    if __name__ == "__main__":
        pool = multiprocessing.Pool(processes=4)  # 同时跑十个进程
        result = []
        for i in xrange(10):  # 先把这100个跑完,然后每次跑其中的十个
            msg = "hello %d" % (i)
            print msg + "---"
            result.append( pool.apply_async(func, (msg, i)))
        pool.close()
        pool.join()
        for res in result: #进程池中的任务结束后,输出完成的状态
            print res.get()
        print "Sub-process done."
  • 相关阅读:
    idea常用快捷键
    Spring中<bean>标签之使用p标签配置bean的属性
    Mysql语句转义
    Idea使用(摘抄至java后端技术公众号-孤独烟)
    js中scroll滚动相关
    Flask-wtforms类似django中的form组件
    Flask中的数据连接池
    SQLAlchemy
    博客园美化阅读模式
    [NOIP2003] 提高组 洛谷P1039 侦探推理
  • 原文地址:https://www.cnblogs.com/lovychen/p/6478046.html
Copyright © 2020-2023  润新知