尝试学习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. ES6 函数

    函数参数的扩展 默认参数 基本用法 function fn(name,age=17){ console.log(name+","+age); } fn("Amy" ...

  2. zabbix3.2使用自带模板监控MySql

    一.zabbix自带MySql模板监控项 Zabbix3.0之后已经有MySql监控模板了,所以我们只要引用ZabbixServer自带的模板即可.zabbix默认有14个监控项 我们只需获取监控项需 ...

  3. Jmeter学习之-http接口功能测试-入门

    ps:默认已经安装好Jmeter工具,配置好相关环境 打开jmeter 工具,为测试计划重新命名 添加线程组:在测试计划上右键,依次选择“添加>Threads>线程组” 添加http请求: ...

  4. 20189203《Linux内核原理与分析》第一周作业

    实验一 Linux 系统简介 我在这一课中主要学习了Linux是什么,Linux的产生和发展历史,Linux发展中的重要人物以及Linux和Windows在是否收费.软件与支持.安全性等方面存在的一些 ...

  5. redis集群(jedis)批量删除同一前缀

    public Set<String> getByPrefix(String key) { Set<String> setResult = new HashSet<> ...

  6. Go 初体验 - channel.2 - 超时机制

    channel 虽然很好用,但是我们也要考虑异常情况,比如:超时 go 语言怎么解决这个超时问题呢? 可以利用 select 语句: select 的用法与 switch 语言非常类似,由 selec ...

  7. day03 Python字典dict的增删查改及常用操作

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

  8. noip单词接龙

    看了许多题解都好长啊,自不量力的来贴一下代码 (震惊于这都能ac...) 这道题的思路是先从字符串中找有重部分然后直接比较剩下的部分,比较的数据也可以用来计算数值 其实满水的题 总之看注释啦(竟然能耐 ...

  9. angular和vue还有jquery的区别

    angularjs简单介绍和特点 首先angular是一个mvc框架, 使用mvc解耦, 采用model, controller以及view的方式去组织代码, 会将一个html页面分成若干个模块, 每 ...

  10. HTTP请求中POST与GET的区别

      本文章已收录于:   一.原理区别 一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式. ...