尝试学习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. P5280 [ZJOI2019]线段树

    题目链接:洛谷 题目描述:[比较复杂,建议看原题] 这道题太神仙了,线段树上做树形dp. 根据树形dp的套路,都是按照转移的不同情况给节点分类.这里每次modify的时候对于节点的影响也不同,所以我们 ...

  2. Ceph与Gluster之开源存储的对比

    一.Ceph与Gluster之开源存储的对比 一.Ceph与Gluster的原理对比 Ceph和Gluster是Red Hat旗下的成熟的开源存储产品,Ceph与Gluster在原理上有着本质上的不同 ...

  3. cocos2d-x Android(SDK,NDK,JDK,ANT)下载地址

    搭建Android环境需要用到Android SDK.NDK.Ant和JDK: 下载Android SDK  下载Android NDk 下载Android JDK 下载Ant

  4. Fiddler和PostMan的使用例子和下载

    一.Fiddler:先下个 1.先讲下Get请求:很简单就一图示意: 然后再讲下POST:举个例子 请求主体的内容: User-Agent: FiddlerContent-Type: applicat ...

  5. mongDb安装

    1.下载安装包:https://www.mongodb.com/download-center#community 2.tar -xzvf mongodb-linux-x86_64-rhel70-3. ...

  6. JS关键字和保留字汇总(小记)

    ECMA-262 描述了一组具有特定用途的关键字.这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等.按照规则,关键字也是语言保留的,不能用作标识符.以下就是ECMAScript的全部关 ...

  7. 今天整理了一下Winform用的UI插件信息

    平时主要用了一下几个比较好的UI控件: 1:IrisSkin2 皮肤插件.这是一款与编程开发相关的素材资源,主要是提供一些采用IrisSkin2.dll控件进行软件窗口换肤的素材文件,包括一些GIF图 ...

  8. Tomcat 加载 jsp 异常:ServletException: java.lang.LinkageError

    环境:win10 JDK:java version "1.8.0_131" mvn 内置 Tomcat 报错: javax.servlet.ServletException: ja ...

  9. [C++ Primer Plus] 第6章、分支语句和逻辑运算符(二)课后习题

    一.复习题 3. #include<iostream> using namespace std; void main() { char ch; int c1, c2; c1 = c2 = ...

  10. opencv学习之路(21)、模板匹配及应用

    一.模板匹配概念 二.单模板匹配 #include "opencv2/opencv.hpp" #include <iostream> using namespace s ...