关于python进程池先close再join的疑惑

8人阅读 评论(0) 收藏 举报
分类:
import time
from multiprocessing import Pool
def run(fn):
  #fn: 函数参数是数据列表的一个元素
  time.sleep(1)
  return fn*fn

if __name__ == "__main__":
  testFL = [1,2,3,4,5,6]  
  print 'shunxu:' #顺序执行(也就是串行执行,单进程)
  s = time.time()
  for fn in testFL:
    run(fn)

  e1 = time.time()
  print "顺序执行时间:", int(e1 - s)

  print 'concurrent:' #创建多个进程,并行执行
  pool = Pool(5)  #创建拥有5个进程数量的进程池
  #testFL:要处理的数据列表,run:处理testFL列表中数据的函数
  rl =pool.map(run, testFL) 
  pool.close()#关闭进程池,不再接受新的进程
  pool.join()#主进程阻塞等待子进程的退出
  e2 = time.time()
  print "并行执行时间:", int(e2-e1)
  print rl
def close(self):
        debug('closing pool')
        if self._state == RUN:
            self._state = CLOSE
            self._worker_handler._state = CLOSE

由上可知,当进程池close的时候并未关闭进程池,只是会把状态改为不可再插入元素的状态,完全关闭进程池使用

def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool,
                        worker_handler, task_handler, result_handler, cache):
        # this is guaranteed to only be called once
        debug('finalizing pool')

        worker_handler._state = TERMINATE
        task_handler._state = TERMINATE

        debug('helping task handler/workers to finish')
        cls._help_stuff_finish(inqueue, task_handler, len(pool))

        assert result_handler.is_alive() or len(cache) == 0

        result_handler._state = TERMINATE
        outqueue.put(None)                  # sentinel

        # We must wait for the worker handler to exit before terminating
        # workers because we don't want workers to be restarted behind our back.
        debug('joining worker handler')
        if threading.current_thread() is not worker_handler:
            worker_handler.join(1e100)

        # Terminate workers which haven't already finished.
        if pool and hasattr(pool[0], 'terminate'):
            debug('terminating workers')
            for p in pool:
                if p.exitcode is None:
                    p.terminate()

        debug('joining task handler')
        if threading.current_thread() is not task_handler:
            task_handler.join(1e100)

        debug('joining result handler')
        if threading.current_thread() is not result_handler:
            result_handler.join(1e100)

        if pool and hasattr(pool[0], 'terminate'):
            debug('joining pool workers')
            for p in pool:
                if p.is_alive():
                    # worker has not yet exited
                    debug('cleaning up worker %d' % p.pid)
                    p.join()
查看评论

Python 多进程池的学习

最近想用python写个爬虫,根据学校图书馆的学号密码。由于学校图书馆初始密码为6位数字,而且不需要验证码,所以破解起来很简单。思路就是生成6为数字暴力密码本,依次向网页POST“学号-密码”的表单即...
  • u011964923
  • u011964923
  • 2016年12月17日 17:00
  • 1100

mysql join 语句中 on 和 where 的问题

从其他技术文章里有看到关于mysql执行顺序的问题 关于执行顺序,有如结论: FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符合的行...
  • a65512878
  • a65512878
  • 2017年05月08日 17:38
  • 192

分页语句特殊搞法-内联改join

SQL>   select * from (select rows_.*, rownum rn from ( select piresult.* from (select null IMPLEMENT...
  • zuixinnet
  • zuixinnet
  • 2013年08月15日 14:55
  • 1405

关于进程池的疑惑

http://blog.csdn.net/guosha/archive/2009/02/10/3874998.aspx最近在学多进程和多线程。看到上面的关于进程池的解决办法再加上老师的介绍,觉得有点不...
  • newyibo
  • newyibo
  • 2011年05月12日 20:39
  • 455

python thread之join

join(timeout=None) Wait until the thread terminates. This blocks the calling thread until the thread...
  • Cain
  • Cain
  • 2011年07月13日 14:18
  • 27422

Python多进程并发操作进程池Pool

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process...
  • xfyangle
  • xfyangle
  • 2017年03月25日 14:39
  • 426

join,sort等命令

.join的用法 join用来将来自两个分类文本文件的行连在一起。如果学过 S Q L语言,可能会很熟悉join命令。 join的一般格式为: join [option] input-file1...
  • u012016940
  • u012016940
  • 2014年09月18日 10:34
  • 427

Python多进程之进程池

由于Python中线程封锁机制,导致Python中的多线程并不是正真意义上的多线程。当我们有并行处理需求的时候,可以采用多进程迂回地解决。如果要在主进程中启动大量的子进程,可以用进程池的方式批量创建子...
  • T_27080901
  • T_27080901
  • 2017年04月05日 11:28
  • 2827

含join,order by,group by的复杂语句优化

工作上碰到了几个慢查询,之前在没有SSD的情况下要跑十几个小时,jias
  • cug_jiang126com
  • cug_jiang126com
  • 2014年09月26日 16:12
  • 1208

SQL中left outer join与inner join 混用时,SQL Server自动优化执行计划

以下为示例代码:  set statistics profile off DECLARE @t TABLE(id1 INT,c VARCHAR(10)) INSERT INTO @t V...
  • yupeigu
  • yupeigu
  • 2011年10月21日 11:11
  • 4130
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1402
    排名: 3万+