python第三方库系列之十七--multiprocessing库

说到并发,我们想到多线程和多进程。

那到底使用多进程还是多线程呢?这得看情况。我们的程序一般分为:

1)耗网络的(有很大一部分时间是在网络交互);

2)耗CPU的(得充分利用多核)

在第一种情况,时间大部分被网络延时占用,所以使用多线程和多进程都差不多。

在第二种情况,时间的长短由CPU是否被充分利用决定,看《python第三方库系列之十二--多线程threading库》可知,多线程会出现锁机制,所以多进程更胜一筹,充分利用了CPU,节省了时间。

以下是一个多进程例子:

#coding=utf-8
import os
import traceback
import time
from multiprocessing import Process, Manager

CASE_COUNTS = 100
PROCESS_COUNTS = 10

def assign_task_index(index):
    try:
        if CASE_COUNTS % PROCESS_COUNTS == 0:
            section_num = CASE_COUNTS / PROCESS_COUNTS
        else:
            section_num = CASE_COUNTS / PROCESS_COUNTS + 1
        if CASE_COUNTS % section_num == 0:
            process_count = CASE_COUNTS / section_num
        else:
            process_count = CASE_COUNTS / section_num + 1
        start_index = section_num * (index - 1) + 1
        end_index = section_num * index
        if index == process_count:
            end_index = CASE_COUNTS
        #print start_index, end_index
        return start_index, end_index
    except Exception as e:
        print traceback.format_exc()

def do_single_process(index, q):
    start_index, stop_index = assign_task_index(index)
    for i in range(start_index, stop_index+1):
        try:
            is_even_number = i % 2
            if is_even_number == 0:
                q.put(i)
            else:
                #print i
                pass
        except Exception as e:
            print traceback.format_exc()

def do_multi_process():
    try:
        process_queue = []
        m = Manager()
        q = m.Queue()  # 用于进程间通信,记录运行结果
        for index in range(PROCESS_COUNTS) :
            try :
                pid = Process(target=do_single_process, args=(index+1, q))
            except :
                print traceback.format_exc()
                os._exit(-1)
            else :
                process_queue.append(pid)

        time_start = time.time()
        for pid in process_queue :
            pid.start()

        # 等待所有进程都完成
        for pid in process_queue:
            pid.join()

        time_end = time.time()
        time_delta = time_end - time_start
        print "总共个数:%s,偶数个数:%s,奇数个数:%s,耗时(秒):%s" %               (str(CASE_COUNTS), str(q.qsize()), str(CASE_COUNTS - q.qsize()), str(time_delta))
    except Exception as e:
        print traceback.format_exc()

if __name__ == '__main__':
    do_multi_process()
时间: 2024-10-14 16:32:34

python第三方库系列之十七--multiprocessing库的相关文章

python第三方库系列之十--commands库

我们这次讲的是利用commands模块执行Linux shell命令,当我们用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数: 1.commands.getoutput('shell command') 2.commands.getstatus('file') 3.commands.getstatusoutput('shell command

python第三方库系列之九--os库

我们经常会与文件和目录打交道,对于这些操作python提供了一个os模块,里面包含了很多操作文件和目录的函数.想要知道有哪些方法,我们可以运行下面的语句,就可以在屏幕上输出os模块的所有信息: import os help(os) 如果你对linux基本操作了解的话,下面的一些os方法应该会很熟悉的,因为基本和linux下的操作方法相同.下面举几个常用的: 1.os.getcwd() 获得当前路径 讲到路径,顺便讲讲路径的几种方法 import os Base1 = os.path.dirnam

python多进程那点事儿【multiprocessing库】

前言:项目中有个需求需要对产品的日志处理,按照产品中日志的某些字段,对日志进行再次划分.比如产品的日志中含有字段id,tag=1,现在需要把tag是基数的放到一个文件中,tag是偶数的放入一个文件中.这就涉及到多个文件的读写操作,一个文件一个文件读取写入那时间太久了,公司配备的单机,跑了半个多小时,光标还是一直在闪闪闪[你懂得].没办法了,还是用多进程跑吧.这就得对python中的多进程从新回顾一遍了. Q1:为什么不用多线程呢? A1:这个就需要了解python多线程的实现原理了,通过在其解释

python第三方库系列之十四--集群化部署定时任务apscheduler库

如果将定时任务部署在一台服务器上,那么这个定时任务就是整个系统的单点,这台服务器出现故障的话会影响服务.对于可以冗余的任务(重复运行不影响服务),可以部署在多台服务器上,让他们同时执行,这样就可以很简单的避免单点.但是如果任务不允许冗余,最多只能有一台服务器执行任务,那么前面的方法显然行不通.本篇文章就向大家介绍如何避免这种互斥任务的单点问题,最后再介绍一下基于APScheduler的分布式定时任务框架,这个框架是通过多个项目的实践总结而成的. 对于运行在同一台服务器上的两个进程,可以通过加锁实

python第三方库系列之十八--python/django test库

django是属于python语音的web框架,要说django測试.也能够先说说python的測试.django能够用python的方式測试,当然,django也基于python封装了一个自己的測试库. 一.python的測试--unitest库 def my_func(a_list, idx): return a_list[idx] import unittest class MyFuncTestCase(unittest.TestCase): def testBasic(self): a

Python第三方库之openpyxl(11)

Python第三方库之openpyxl(11) Stock Charts(股票图) 在工作表上按特定顺序排列的列或行中的数据可以在股票图表中绘制.正如其名称所暗示的,股票图表通常被用来说明股价的波动.然而,这张图表也可以用于科学数据.例如,你可以用一个股票图表来表示每日或每年的温度波动.您必须按照正确的顺序组织您的数据,以创建股票图表. 在工作表中组织股票图表数据是非常重要的.例如,为了创建一个简单的高低收盘价的股票图表,您应该按照这个顺序将您的数据以高.低和接近的形式排列为列标题. 尽管股票图

python第三方库学习之xlrd读取Excel文件

因为经常会涉及到从Excel表中导数据,所以就学习了python的xlrd来读取excel中的数据. 1.xlrd的安装 xlrd是python的第三方库,所以是需要自己安装的,可以在python的官网http://pypi.python.org/pypi/xlrd下载该模块来安装,也可以通过其他手段,比如easy_install或者pip啥的,我已经安装好pip所以就用最懒的方式来安装了pip install xlrd来安装. 2.分析excel文件的层级对象 要读取excel的数据,就要了解

Python第三方常用工具、库、框架等

Python ImagingLibrary(PIL):它提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换.打印和显示.还能进行一些图形效果的处理,如图形的放大.缩小和旋转等.是用户进行图象处理的强有力工具. http://www.pythonware.com/products/pil/ matplotlib:一个Python的2D绘图库. http://matplotlib.org/ Pmw(Pythonmegawidgets):它是超级GUI组件集----一个利

Python 第三方库xlrd读取Excel代码

Python 第三方库xlrd读取Excel代码: 安装xlrd 安装xlrd,只需运行setup即可,另外你也可以直接解压缩到你的project中,也可以直接用 xlrd的API 获取Excel,这里称之为work book open_workbook(file_name) 获取指定的Sheet,有两种方式 sheet = xls.sheet_by_index(sheet_no) sheet = xls.sheet_by_name(sheet_name) 获取整行和整列的值(数组) sheet