一 Process类

  multiprocessing模块下的一个类

  创建子进程。

  有两种方法

  方法一

from multiprocessing import Process
import os
def foo():
print('%s from foo'%os.getpid())
def bar():
print('%s from bar' % os.getpid())
if __name__ == '__main__':
p1=Process(target=foo)
p2=Process(target=bar)
p1.start()
p2.start()
p1.join()
p2.join()
print('%s over'%os.getpid())

  输出: 

13524 from foo
12848 from bar
12696 over

  方法二

from multiprocessing import Process
import os
class Myprocess(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s from %s' % (os.getpid(),self.name))
if __name__ == '__main__':
p1=Myprocess('foo')
p2=Myprocess('bar')
p1.start()
p2.start()
p1.join()
p2.join()
print('%s over' % os.getpid())

  输出:

15260 from foo
5980 from bar
8844 over

二 Thread类

  threading模块下的类

  创建线程

  有两种方法

  与Process类一样。

三 Pool类

  Pool类的方法:

    p=Pool()

    p.apply_async(),异步提交任务,生成ApplyResult对象

    p.close()

    p.join()

    ApplyResult.get(),从ApplyResult对象中获取返回值。

from multiprocessing import Pool
import os,time
def foo():
time.sleep(1)
print('%s from foo'%os.getpid())
return 'foo'
def bar():
time.sleep(2)
print('%s from bar' % os.getpid())
return 'bar'
if __name__ == '__main__':
p=Pool()
t1=time.time()
res1=p.apply_async(foo)
res2=p.apply_async(bar)
p.close()
p.join()
print(res1)
print(time.time()-t1) ##多出来的0.15秒是开启进程所花费的时间
t2=time.clock()
print(res1.get())
print(res2.get())
print(time.clock()-t2)

  输出:

12468 from foo
8832 from bar
<multiprocessing.pool.ApplyResult object at 0x00000126511CEE48>
2.1609864234924316
foo
bar
2.1880321932470032e-05

  map()方,比较常用。

  官方介绍:

Apply `func` to each element in `iterable`, collecting the results
in a list that is returned.

  废话少说,上代码

import time
from multiprocessing import Pool def foo(x):
time.sleep()
return x*x if __name__ == '__main__':
l = [,,,,,,,,,]
t1 = time.time()
p = Pool()
print(time.time()-t1)
res = p.map(foo,l) # 这行代码表示所有的进行都已经执行完了,并且每个进程的结果都拿到,放在了res中
print(time.time()-t1)
print(res,type(res))
p.close()
p.join()
print(time.time()-t1)

  输出:

0.14187192916870117
2.2597498893737793
[, , , , , , , , , ] <class 'list'>
2.401075601577759

四 gevent

  gevent是一个基于协程的Python网络库。

  单线程实现并发,协程。

  需要用到猴子补丁。

  方法:

    g1=gevent.spawn(func):提交任务,生成Greenlet对象--g1。

    g1.join(),阻塞,直到g1任务完成。

    g1.value。从Greenlet对象g1中获取返回值。   

import gevent
from gevent import monkey;monkey.patch_all()
import os,time
from threading import current_thread
def foo():
time.sleep(1)
print('%s %s from foo'%(os.getpid(),current_thread().getName()))
def bar():
time.sleep(2)
print('%s %s from bar' % (os.getpid(),current_thread().getName()))
t1=time.time()
g1=gevent.spawn(foo)
g2=gevent.spawn(bar)
print(g1,g2)
g1.join()
g2.join()
print(time.time()-t1)

  输出:

<Greenlet at 0x1e3fc1396d0: foo> <Greenlet at 0x1e3fc139800: bar>
7536 DummyThread-1 from foo
7536 DummyThread-2 from bar
2.0017032623291016 #可以看到协程开启进程花销非常小。

五 ProcessPoolExecutor

  创建多进程

  concurrent.futures库内的ProcessPoolExecutor类

  executor=ProcessPoolExecutor():生成一个ProcessPoolExecutor对象;

  future=executor.submit():提交任务,返回一个Future对象。

  executor.shutdown()。相当于Pool类中的close()和join()

  future.result():从Future对象中获取其返回值。

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import os,time
from threading import current_thread
def foo():
time.sleep(1)
print('%s %s from foo'%(os.getpid(),current_thread().getName()))
return 'foo'
def bar():
time.sleep(2)
print('%s %s from bar' % (os.getpid(),current_thread().getName()))
return 'bar'
if __name__ == '__main__':
t1=time.time()
executor=ProcessPoolExecutor()
print('executor',executor)
future1=executor.submit(foo)
future2=executor.submit(bar)
print(future1,future2)
executor.shutdown()
print(future1.result())
print(future2.result())
print(time.time()-t1)

  输出:

6480  MainThread from foo
6756 MainThread from bar
foo
bar
2.7526917457580566 #可以看到创建进程还是比较花费时间的

六 ThreadPoolExecutor()

  创建多线程

  concurrent.futures库内的ProcessPoolExecutor类

  executor=ThreadPoolExecutor():生成一个ThreadPoolExecutor对象;

  future=executor.submit():提交任务,返回一个Future对象。

  executor.shutdown()。相当于Pool类中的close()和join()。

  future.result():从Future对象中获取其返回值。

  

from concurrent.futures import ThreadPoolExecutor
import os,time
from threading import current_thread
def foo():
time.sleep(1)
print('%s %s from foo'%(os.getpid(),current_thread().getName()))
return 'foo'
def bar():
time.sleep(2)
print('%s %s from bar' % (os.getpid(),current_thread().getName()))
return 'bar'
if __name__ == '__main__':
t1=time.time()
executor=ThreadPoolExecutor()
print('executor',executor)
future1=executor.submit(foo)
future2=executor.submit(bar)
print(future1,future2)
executor.shutdown()
print(future1.result())
print(future2.result())
print(time.time()-t1)

  输出:

executor <concurrent.futures.thread.ThreadPoolExecutor object at 0x0000020073EAAAC8>
<Future at 0x20073eb4198 state=running> <Future at 0x20074176940 state=running>
4380 <concurrent.futures.thread.ThreadPoolExecutor object at 0x0000020073EAAAC8>_0 from foo #可以看到进程号是一样的
4380 <concurrent.futures.thread.ThreadPoolExecutor object at 0x0000020073EAAAC8>_1 from bar
foo
bar
2.001234531402588 #相比较开启进程,线程开启的时间非常快,花销非常小

Process类,Thread类,Pool类,gevent类,ProcessPoolExecutor,ThreadPoolExecutor的用法比较的更多相关文章

  1. 从零开始构建一个Reactor模式的网络库(二)线程类Thread

    线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...

  2. C#中Monitor类、Lock关键字和Mutex类

    线程:线程是进程的独立执行单元,每一个进程都有一个主线程,除了主线程可以包含其他的线程.多线程的意义:多线程有助于改善程序的总体响应性,提高CPU的效率.多线程的应用程序域是相当不稳定的,因为多个线程 ...

  3. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  4. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  5. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  6. E:in-range伪类选择器与E:out-of-range伪类选择器

    E:in-range伪类选择器用来指定当元素的有效值被限定在一段范围之内(通常通过min属性值与max属性值来限定),且实际输入值在该范围内时使用的样式.E:out-of-range伪类选择器用来指定 ...

  7. php面向对象之抽像类、接口、final、类常量

    一.抽像类(abstract)        在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性语法结构:  代码如下 复制代码   ab ...

  8. YTU 2618: B 求类中数据成员的最大值-类模板

    2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec  内存限制: 128 MB 提交: 430  解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...

  9. JAVA类与对象(三)----类定义关键字详解

    static 表示静态,它可以修饰属性,方法和代码块. 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有.这个属性就是全类 ...

随机推荐

  1. C++容器类-list

    C++ 表(List容器类) 一.概念 头文件:#include <list> 又叫链表,是一种双线性链表,只能顺序访问(从前往后或从后往前) 他不支持随机访问. 二.方法 #includ ...

  2. Mybatis学习记录(2)

    1.mybatis与hibernate不同 Mybatis和hibernate,mybatis不完全是一个ORM框架,因为Mybatis需要程序员自己编写sql语句.mybatis可以通过xml或注解 ...

  3. Windows上PostgreSQL安装配置教程

    Windows上PostgreSQL安装配置教程 这篇文章主要为大家详细介绍了Windows上PostgreSQL安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PostgreSQL的 ...

  4. C++ 学习笔记 开篇

    从大一开始学习C语言,大学期间做了许多嵌入式的开发项目,毕业后从事嵌入式开发工作主要的开发语言也是C语言.虽然期间断断续续的学习过C++,做过QT.C#上位机但也只是在其他语言的外壳下使用C在开发,始 ...

  5. python入门:最基本的用户登录

    #! usr/bin/env python # -*- coding: utf-8 -*- #最基本的用户登录 import getpass usre = input("username:& ...

  6. 学习路由器vue-router

    vue-router:vue官方路由管理器. 功能:嵌套的路由/视图表模块化的.基于组件的路由配置路由参数.查询.通配符基于 Vue.js 过渡系统的视图过渡效果细粒度的导航控制带有自动激活的 CSS ...

  7. vue组件:canvas实现图片涂鸦功能

    方案背景 需求 需要对图片进行标注,导出图片. 需要标注N多图片最后同时保存. 需要根据多边形区域数据(区域.颜色.名称)标注. 对应方案 用canvas实现涂鸦.圆形.矩形的绘制,最终生成图片bas ...

  8. 通过composer安装阿里大于接口扩展

    # 安装laravel阿里大鱼服务 composer require iscms/alisms-for-laravel laravel配置 # 注册服务 # 在config\app.php文件中找到P ...

  9. 【php】php安全问题

    使用 —enable-force-cgi-redirect 选项 设置 doc_root 或 user_dir 或 open_basedir PHP运行的用户身份不能为ROOT 数据库字段加密 程序不 ...

  10. Kafka 基础实战 :消费者和生产者实例

    学习地址: http://www.jikexueyuan.com/course/2036.html