zoukankan      html  css  js  c++  java
  • Python爬虫--进程和线程1

    多进程

    1、使用multiprocessing 模块创建多进程

    Process

    Process类描述一个进程对象,创建Process实例只需要传入一个函数和函数的参数即可。

    1. 使用 Process() 方法创建进程
    2. 使用 start() 方法启动进程
    3. 使用 join() 方法实现进程同步

    一个例子:

    # coding=utf8
    import os
    from multiprocessing import Process
    def run_proc(name):
        print 'child process %s (%s) running...' %(name, os.getpid())
    if __name__ == '__main__':
        print 'Parent process is %s.' % os.getpid()
        for i in range(5):
            p = Process(target=run_proc, args=(str(i),))
            print 'process will start'
            p.start()
        p.join()
        print 'main process end'
    
    Pool

    Pool类描述一个进程池对象,可以提供指定数量的进程共用户调用,默认大小是CPU的核数。
    一个例子:

    # coding=utf8
    from multiprocessing import Pool
    import os, time, random
    
    def run_task(name):
        print 'Task %s (pid = %s) is running...' % (name, os.getpid())
        time.sleep(random.random() * 3)
        print 'Task %s end.' % name
        
    if __name__ == '__main__':
        print 'Current process %s.' % os.getpid()
        p = Pool(processes=3)
        for i in range(5):
            p.apply_async(run_task, args=(i,))
        print 'Waiting for all subprocesses done...'
        p.close() # 调用join()之前先必须调用close(),调用close()之后就不会继续添加新的Process了
        p.join()
        print 'All subprocesses done.'
    

    2、进程间通信

    Queue

    Queue类用来在多个进程间实现通信

    1. put方法:插入数据到队列中
    2. get方法:从队列中读取并删除一个元素

    一个例子:

    # coding=utf8
    '''
    从父进程创建三个子进程,两个进程往Queue中写数据,一个从Queue中读数据
    '''
    from multiprocessing import Process, Queue
    import os, time, random
    from test.test_threading_local import target
    
    # 写进程
    def proc_write(q,urls):
        print 'Process (%s) is writing...' % os.getpid()
        for url in urls:
            q.put(url)
            print 'Put %s to Queue...' % url
            time.sleep(random.random())
    
    # 读进程
    def proc_read(q):
        print 'Process %s is reading...' % os.getpid()
        while True:
            url = q.get()
            print 'Get %s from queue' % url
    
    if __name__ == '__main__':
        q = Queue()
        writer1 = Process(target=proc_write, args=(q, ['url_1','url_2','url_3']))
        writer2 = Process(target=proc_write, args=(q, ['url_4','url_5','url_6']))
        reader = Process(target=proc_read, args=(q,))
        # 启动写进程
        writer1.start()
        writer2.start()
        # 启动读进程
        reader.start()
        # 等待写进程结束
        writer1.join()
        writer2.join()
        # 强制结束读进程
        reader.terminate()
    
    Pipe

    Pipe类用来在两个进程之间通信,类似于一个管道,Pipe方法返回(conn1,conn2)代表管道两端,参数duplex为True是全双工模式。
    一个例子:

    # coding=utf8
    from multiprocessing import Pipe, Process
    import random, time, os
    from test.test_threading_local import target
    
    '''
    创建两个进程,一个通过Pipe发送数据,一个通过Pipe接收数据
    '''
    def proc_send(pipe, urls):
        for url in urls:
            print 'Process (%s) send: %s' % (os.getpid(), url)
            pipe.send(url)
            time.sleep(random.random())
    
    def proc_recv(pipe):
        while True:
            print 'Process (%s) recv: %s' % (os.getpid(), pipe.recv())
            time.sleep(random.random())
    
    if __name__ == '__main__':
        pipe = Pipe()
        p1 = Process(target=proc_send, args=(pipe[0], ['url_'+str(i) for i in range(10)]))
        p2 = Process(target=proc_recv, args=(pipe[1],))
        p1.start()
        p2.start()
        p1.join()
        p2.terminate()
    

    作者:lykxbg —— 来一块小饼干

    出处:http://www.cnblogs.com/lykxbg/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    浅谈Python常用英文单词
    python web框架 Django的APP以及目录介绍 2
    Python中的enumerate函数
    python web框架 django wsgi 理论
    python web框架 django 工程 创建 目录介绍
    python web框架 django工程的创建
    mysql c 终止 mysql输入语句模式
    前端 html input标签 placeholder属性 标签上显示内容
    img 标签注意 默认img标签,有一个1px的边框 img{ border: 0; }
    前端 html input标签 disable 属性
  • 原文地址:https://www.cnblogs.com/lykxbg/p/11963628.html
Copyright © 2011-2022 走看看