『Python』多进程处理
尝试学习python的多进程模组,对比多线程,大概的区别在:
1.多进程的处理速度更快
2.多进程的各个子进程之间交换数据很不方便
多进程调用方式
进程基本使用multicore()
进程池优化进程的调用multicore_pool(),在使用进程池的时候,运许函数有return,而基本用法中进程是接收不了return的
进程队列用法,大部分方法和python的基本队列是一致的,
q=mp.Queue() 声明
q.put() 添加
q.get() 释放
q.empty() 判断是不是空的
"""
Created on Tue Dec 5 09:00:00 2017 @author: hellcat
""" import time
import numpy as np
import threading as td
import multiprocessing as mp def job(q):
for i in range(3):
q.put(i) def multicore():
q=mp.Queue()
ps = [mp.Process(target=job,args=(q,)),
mp.Process(target=job,args=(q,))] # 基本的子进程创建方法
for p in ps:
p.start() time.sleep(3) for p in ps:
p.join() # 需要协调结束 while True:
if q.empty() != True:
print(q.get())
else:
break def multithread():
q=mp.Queue()
ps = [td.Thread(target=job,args=(q,)),
td.Thread(target=job,args=(q,))] # 基本的子线程创建方法
for p in ps:
p.start() time.sleep(3) for p in ps:
p.join() while True:
if q.empty() != True:
print(q.get())
else:
break def job_pool(q):
res0 = 0
for i in range(np.random.randint(10)):
res0 += i**3
return res0 def multicore_pool():
pool = mp.Pool(processes=2) # 初始化进程池,可以指定进程数
res1 = pool.map(job_pool,range(20)) # map方法在线程池中同时添加多个线程
print(res1) # 返回值为函数的return
res2 = [pool.apply_async(job_pool,(i,)) for i in range(20)] # 在进程池中单个添加进程
print([res.get() for res in res2]) # 注意此时每个进程的返回并不直接是return,需要get方法得到的才是return
# for res in res2:
# print(res.get()) if __name__=='__main__':
# multicore()
# multithread()
multicore_pool()
进程共享变量 & 进程锁
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 5 10:15:58 2017 @author: hellcat
""" import time
import multiprocessing as mp def job(v,num,l): # 需要把共享变量实例作为参数传入才行
l.acquire() # 进程锁锁住
for _ in range(10):
time.sleep(0.1)
v.value += num # 获取共享变量的值,并进行操作
print(v.value)
l.release() # 进程锁释放 def muticore():
l = mp.Lock() # 实例化进程锁
v = mp.Value('i',0) # 实例化共享变量
# p = mp.Pool(processes=2) # p.map(job,((v,1,l),(v,3,l)))
p1 = mp.Process(target=job,args=(v,1,l))
p2 = mp.Process(target=job,args=(v,3,l))
p1.start()
p2.start()
p1.join()
p2.join() if __name__=='__main__':
muticore()
不同于多线程使用全局变量就可以以共享变量,多进程必须使用 v = mp.Value('i',0)这样的语句声明变量(其实还可以是mp.Array('i',[1,2,3]),注意,这里只能是1维的list,[[1,2]]这样都是不可以的),并将v作为参数传给函数,在函数内部使用的时候也需要使用v.value来唤醒其值。
进程锁会在锁住时阻止其他进程使用共享变量,所以可以看到输出中先执行了10次+1,然后执行了10次+3,而不使用进程锁+1和+3会无规律的交替进行:
注释掉进程锁:
1
4
5
8
9
12
13
16
17
20
21
24
25
28
29
32
33
36
37
40使用进程锁(上面代码没有注释掉进程锁):
1
2
3
4
5
6
7
8
9
10
13
16
19
22
25
28
31
34
37
40
『Python』多进程处理的更多相关文章
- 『Python』多进程
Python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在Python中大部分情况需要使用多进程.Python提供了multiprocessin ...
- 『Python』__getattr__()特殊方法
self的认识 & __getattr__()特殊方法 将字典调用方式改为通过属性查询的一个小class, class Dict(dict): def __init__(self, **kw) ...
- 『Python』优雅的记录日志——loguru
1. 安装 pip install loguru 2. 初识 from loguru import logger logger.debug("This is a debug..." ...
- 『Python』 ThreadPool 线程池模板
Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...
- 『Python』Python 调用 ZoomEye API 批量获取目标网站IP
#### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...
- 『Python』 多线程 共享变量的实现
简介: 对于Python2而言,对于一个全局变量,你的函数里如果只使用到了它的值,而没有对其赋值(指a = XXX这种写法)的话,就不需要声明global. 相反,如果你对其赋了值的话,那么你就需要声 ...
- 『Python』为什么调用函数会令引用计数+2
一.问题描述 Python中的垃圾回收是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. sys.g ...
- 『Python』库安装
1.安装指定版本的tensorflow 虽然官网有4种安装方式,并且推荐用anaconda的方式,但是有时候我们需要指定版本的tensorflow,而pip可以做到. 比如我装的是anaconda3. ...
- 『Python』装饰器
一.参考 作者:zhijun liu 链接:https://www.zhihu.com/question/26930016/answer/99243411 来源:知乎 建议大家去原答案浏览 二.装饰器 ...
随机推荐
- 016-并发编程-java.util.concurrent.locks之-Lock及ReentrantLock
一.概述 重入锁ReentrantLock,就是支持重进入的锁 ,它表示该锁能够支持一个线程对资源的重复加锁.支持公平性与非公平性选择,默认为非公平. 以下梳理ReentrantLock.作为依赖于A ...
- Ch03 数组相关操作 - 练习
1. 编写一段代码,将a设置为一个n个随机数的数组,要求随机数介于0(包含)和n(不包含)之间. //import java.lang.Math def getArray(n:Int)={ val ...
- 简单配置jena在eclipse的开发环境
Jena:A free and open source Java framework for building Semantic Web and Linked Data applications. 耶 ...
- Linux下的.txt文件复制到win下面不自动换行
原因:在Linux系统下, '\n'就是一个换行符,而在windows下,它是由回车换行组成,表示为 \r\n 解决方法:用Notepad++打开文档-->编辑-->文档格式转换--> ...
- 解决wine中文字体方块或乱码
从Windows使用字体 如果有一个安装了Windows的分区, 可以通过链接它们来使用其字体. 例如, Windows的C:\盘被挂载在/windows: # ln -s /windows/Wind ...
- docker mysql 数据库乱码
创建 mysql 时,需要加上编码,不然会乱码: docker run --name mysql01 -p : -e MYSQL_ROOT_PASSWORD=pwd123 -d mysql:5.5 - ...
- restful规范快速记忆
restful规范: 十个规则: 用户发来请求,url必须: 1.因为是面向资源编程,所以每个URL代表一种资源,URL中尽量不要用动词,要用名词 2.尽量使用HTTPS,https代替http 3. ...
- python 用lambda表达式代替简单的函数, 匿名函数
lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方 格式: lambda 参数列表:return [表达式] 变量 由于lambda返回的是函数对象(构建的是一个函数对象),所 ...
- 4A Watermelon
A. Watermelon time limit per test 1 second memory limit per test 64 megabytes input standard input o ...
- shell实现自动部署两台tomcat项目Ⅱ
本次分为3个脚本, scp.sh放进第一台机器(负责传输文件), schenglee.sh放进第一台机器(自动部署), schenglee2.sh放进第二台机器(自动部署) 环境 tomcat1: 1 ...