尝试学习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』多进程处理的更多相关文章

  1. 『Python』多进程

    Python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在Python中大部分情况需要使用多进程.Python提供了multiprocessin ...

  2. 『Python』__getattr__()特殊方法

    self的认识 & __getattr__()特殊方法 将字典调用方式改为通过属性查询的一个小class, class Dict(dict): def __init__(self, **kw) ...

  3. 『Python』优雅的记录日志——loguru

    1. 安装 pip install loguru 2. 初识 from loguru import logger logger.debug("This is a debug..." ...

  4. 『Python』 ThreadPool 线程池模板

    Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...

  5. 『Python』Python 调用 ZoomEye API 批量获取目标网站IP

    #### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...

  6. 『Python』 多线程 共享变量的实现

    简介: 对于Python2而言,对于一个全局变量,你的函数里如果只使用到了它的值,而没有对其赋值(指a = XXX这种写法)的话,就不需要声明global. 相反,如果你对其赋了值的话,那么你就需要声 ...

  7. 『Python』为什么调用函数会令引用计数+2

    一.问题描述 Python中的垃圾回收是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. sys.g ...

  8. 『Python』库安装

    1.安装指定版本的tensorflow 虽然官网有4种安装方式,并且推荐用anaconda的方式,但是有时候我们需要指定版本的tensorflow,而pip可以做到. 比如我装的是anaconda3. ...

  9. 『Python』装饰器

    一.参考 作者:zhijun liu 链接:https://www.zhihu.com/question/26930016/answer/99243411 来源:知乎 建议大家去原答案浏览 二.装饰器 ...

随机推荐

  1. 17.2-uC/OS-III消息管理(任务消息队列)

    1.任务的消息队列 uC/OS-III在任务中内建了一个消息队列.用户可以直接发送消息给任务而不通过外部消息队列. 这个特性不仅简化了代码, 还提供了效率.每个任务都内建一个消息队列. uC/OS-I ...

  2. 点击鼠标出现漂浮字体("自信", "自强", "坚持"...)效果实现

    前面我们谈到了漂浮磁力线/鼠标吸铁石特效你也可以实现,现在来聊聊点击鼠标出现漂浮字体("自信", "自强", "坚持"...)效果的实现,这 ...

  3. js篇-解析url链接里面的参数名和参数值

    项目背景是,链接为:https://paladin.pingan.com.cn/jf/?appId=PA00200000000_01_APP&id=123456#/fundRank 要求拿到: ...

  4. 用git如何把单个文件回退到某一版本

    暂定此文件为a.jsp 1.首先到a.jsp所在目录: 通过 git  log a.jsp 查看a.jsp的更改记录 2.找到想要回退的版本号:例如 fcd2093 通过 git reset  fcd ...

  5. 【UML】-NO.45.EBook.5.UML.1.005-【UML 大战需求分析】- 通讯图(Communication Diagram)

    1.0.0 Summary Tittle:[UML]-NO.45.EBook.1.UML.1.005-[UML 大战需求分析]- 通讯图(Conmunication Diagram) Style:De ...

  6. Sigleton bj

    package com.bjsxt.base; class Sigleton{ private Sigleton(){}; private static Sigleton instance = new ...

  7. Django框架详细介绍---模型---ORM

    一.概述 ORM(Object Relational Mapping),全称:对象关系映射,简单的说就是通过创建类.实例化出对象的方法,使得类.对象.对象的属性能够和数据库中的表.记录.字段意义对应. ...

  8. Windbg程序调试系列1-Mex扩展使用总结

    最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...

  9. skywalking学习之路---skywalking环境从零搭建部署

    介绍 SkyWalking项目是由华为大牛吴晟开源的个人项目,目前已经加入Apache孵化器.SkyWalking项目的核心目标是针对微服务.Cloud Native.容器化架构提供应用性能监控和分布 ...

  10. Poj1979 Red and Black (DFS)

    Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 47466   Accepted: 25523 D ...