尝试学习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. 20190412 T-SQL语言一

    -- T-SQL ------------------------------------------------------ 例如1 什么是注释符 单行注释select *from kc /*sel ...

  2. Python Async/Await入门指南

    转自:https://zhuanlan.zhihu.com/p/27258289 本文将会讲述Python 3.5之后出现的async/await的使用方法,以及它们的一些使用目的,如果错误,欢迎指正 ...

  3. python_字符串的格式化输出

    name = input("Name:")age = int(input("Age:")) input: 输入的内容默认为字符串格式job = input(&q ...

  4. Docker:Windows7下使用docker toolbox(1)

    一.安装 官方网址:https://docs.docker.com/docker-for-windows/install/ win10以下安装:https://www.docker.com/produ ...

  5. C# Tuple<T1,T2....T>元组的使用

    1) 先说组元:一个数据结构,由通过逗号分割的,用于传递给一个程序或者操作系统的一系列值的组合. NET Framework 直接支持一至七元素的元组 Tuple<T1> Tuple< ...

  6. CDN和智能DNS原理和应用 (原)

    CDN是什么? CDN的全称是Content Delivery Network,即内容分发网络. CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调 ...

  7. Spring Boot中JSON参数传递,后台实体接受问题

    1.json参数为json字符串 var data = { name: '超管不是11', password: '123456' }; $.ajax({ type:"post", ...

  8. 剑指offer(58)对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 主要是要懂得如何去判断对称,比如描述一颗树我们可以通过两个序列就能得 ...

  9. Ubuntu 16.04下vsftpd 安装配置实例

    从https://www.linuxidc.com/Linux/2017-06/144807.htm转载 第一步:安装VSFTPD sudo apt-get install vsftpd 安装完成后启 ...

  10. 最新版的Chrome如何始终开启flash而不是先询问?

     链接:https://www.zhihu.com/question/266170237/answer/342137190  设置Chrome启用Flash,修改配置之前先看Chrome的版本,不同版 ...