Python多进程multiprocessing(二)

紧接上文

在上文Python多进程multiprocessing(一)中我们介绍了多进程multiprocessing的部分基础操作,在本文中,我们将继续介绍关于多进程的一些知识,比如进程池Pool这个有用的东东。马上开始吧!

使用实例

实例1

import multiprocessing as mp

def job(x):
    return x*x

def multicore():
    pool = mp.Pool(processes=2)
    res = pool.map(job,range(10))
    print('map res:',res)

    multi_res = [pool.apply_async(job,(i,)) for i in range(10)]
    print('apply_async res:',[res.get() for res in multi_res])

if __name__ == '__main__':
    multicore()

运行结果:

map res: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
apply_async res: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

解释一下:

  1. 这个例子演示了进程池pool的用法,创建Pool对象并指定使用2个核(默认使用全部)。
  2. 之前我们定义任务的时候是不能有return的,pool的map方法可以将任务依次作用到数据上去。
  3. 另一个类似map的方法是apply_async,但是注意这里传入的参数需要是可迭代的。

实例2

在多线程threading中,我们可以使用global全局变量来共享某个变量,但是在多进程中这是行不通的,我们需要用到共享内存shared memory的形式,具体做法如下:

import multiprocessing as mp

value = mp.Value('d', 3.14)
array = mp.Array('i', [1,2,3])

解释一下:

  1. 这里展示了两种共享内存的形式,一个是Value,一个是Array(其实就是list)
  2. 要注意的是,在定义值的同时需要指定数值类型,比如整型"i",双浮点型"d",详细的见下表:
Type code C Type Python Type Minimum size in bytes
‘b‘ signed char int 1
‘B‘ unsigned char int 1
‘u‘ Py_UNICODE Unicode character 2
‘h‘ signed short int 2
‘H‘ unsigned short int 2
‘i‘ signed int int 2
‘I‘ unsigned int int 2
‘l‘ signed long int 4
‘L‘ unsigned long int 4
‘q‘ signed long long int 8
‘Q‘ unsigned long long int 8
‘f‘ float float 4
‘d‘ double float 8

(更详细的来源)

实例3

import multiprocessing as mp

def job(v,num):
    v.value += num
    print(v.value)

def multicore():
    v = mp.Value('i', 0)
    p1 = mp.Process(target=job,args=(v,1))
    p2 = mp.Process(target=job,args=(v,10))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == '__main__':
    multicore()

运行结果:

1
11

解释一下:

  1. 这就是使用共享内存的作用,两次任务执行是累加的
  2. 在调用共享内存值的时候需要使用.value

实例4

import multiprocessing as mp

def job(v,num,l):
    l.acquire()
    for i in range(10):
        v.value += num
        print(v.value)
    l.release()

def multicore():
    l = mp.Lock()
    v = mp.Value('i', 0)
    p1 = mp.Process(target=job,args=(v,1,l))
    p2 = mp.Process(target=job,args=(v,10,l))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == '__main__':
    multicore()

运行结果:

1
2
3
4
5
6
7
8
9
10
20
30
40
50
60
70
80
90
100
110

解释一下:

  1. 这里演示了Lock的使用,其实用法与多线程的lock一样,也是使用acquire和release方法来控制。
  2. 注意,需要把lock对象作为参数一起传入process里。

小结

多进程multiprocessing的部分就到这里,再加上之前分享的多线程threading,大家应该有了一些直观的印象,什么时候使用多线程多进程,以及使用哪一个还是一起使用都是要看具体任务的。那么,剩下的就是去实际操作了,踩坑填坑,熟练掌握!

原文地址:https://www.cnblogs.com/mrdoghead/p/12125344.html

时间: 2024-11-11 03:21:34

Python多进程multiprocessing(二)的相关文章

python多进程multiprocessing Pool相关问题

python多进程想必大部分人都用到过,可以充分利用多核CPU让代码效率更高效. 我们看看multiprocessing.pool.Pool.map的官方用法 map(func, iterable[, chunksize]) A parallel equivalent of the map() built-in function (it supports only one iterable argument though). It blocks until the result is ready

python多进程-----multiprocessing包

multiprocessing并非是python的一个模块,而是python中多进程管理的一个包,在学习的时候可以与threading这个模块作类比,正如我们在上一篇转载的文章中所提,python的多线程并不能做到真正的并行处理,只能完成相对的并发处理,那么我们需要的就是python的多进程来完成并行处理,把所有的cpu资源都利用起来.multiprocessing的很大一部分与threading使用同一套API,只不过换到了多进程的环境.这里面要注意,对于多进程来说,win32平台和unix平

Python多进程multiprocessing使用示例

mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multiprocessing def worker(num): """thread worker function""" print 'Worker:', num return if __name__ == '__main__': jobs = [] for i

python ---多进程 Multiprocessing

和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 Python 还要出一个 multiprocessing 呢? 原因很简单, 就是用来弥补 threading 的一些劣势, 比如在 threading 教程中提到的GIL. 创建多进程 import multiprocessing as mp import threading as td def

python之multiprocessing(二):multiprocessing.Pool

[实现:多进程paramiko] 1.server_list.txt   :格式   HOST  PORT   USER   PASSWD localhost 22 root root193.168.49.144 22 root root 2.get_server_list.py server_list_file = "server_list.txt"def get_serverlist_dic():        server_dic = {}        f = file(ser

python多进程multiprocessing模块中Queue的妙用

最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个process.Multiprocessing的使用确实能显著提升爬虫速度,不过程序交由用户使用时,缺乏一个好的GUI窗口来显示爬虫进度.之前的文章中使用了Chrome浏览器来渲染js脚本生成了进度条.但是鉴于Chrome在运行时十分吃内存资源,用Chrome只是生成一个进度条难免有些“大材小用”,所以,小

python多进程——multiprocessing.Process

简介 multiprocessing是一个使用类似于threading模块的API支持生成进程的包.该multiprocessing软件包提供本地和远程并发.因此,该multiprocessing模块允许程序员充分利用给定机器上的多个处理器.可以在Unix和Windows上运行. multipleprocessing文档 Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) 应该始终使用关键

Python多进程multiprocessing

import multiprocessing import time # 具体的处理函数,负责处理单个任务 def func(msg): # for i in range(3): print (msg) time.sleep(1) return "done " + msg if __name__ == "__main__": # 进程池,创建多个进程,并行执行 pool = multiprocessing.Pool(processes=4) # 把运行的结果添加到一

python 多进程multiprocessing 模块

multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 multiprocessing.active_children() preces() 创建一个进程对象 multiprocessing.Preces(target=function_name, args=()) target: 函数名 args: 函数需要的参数,以tuple形式传入,一个参数时需(1,)