进程的简单用法:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process
import time# 多进程 multiprocessing 并非是python的一个模块,而是python中多进程管理的一个包,
# 在学习的时候可以与threading这个模块作类比
def func(name):for i in range(3):time.sleep(1000)print("hello", name)if __name__ == "__main__":p = Process(target=func, args=("guolei",))# 类似 线程(thread) 的 setDaemon()# p.daemon = True
    p.start()# p.join()p2 = Process(target=func, args=("xiaming",))# p2.daemon = True
    p2.start()# p2.join()print("2222222")

进程间的数据是无法共享的:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import multiprocessing
import threadingLI = []# 进程之间是独立的, 默认数据是无法被共享的
def append_to_li(item, p_name):LI.append(item)print(p_name, LI, id(LI))if __name__ == '__main__':for i in range(10):# process 数据不共享p = multiprocessing.Process(target=append_to_li, args=(i, "p_name" + str(i),))# thread 数据是共享的# p = threading.Thread(target=append_to_li, args=(i, "p_name" + str(i),))
        p.start()print("end ", LI, id(LI))

使用Array 和 Manager 可以实现进程之间的通讯:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process, Array, Manager
import timedef Foo(i, temp):# time.sleep(2)temp[i] = 100 + ifor item in temp:print(i, "----->", item)def Foo2(i, dic):dic[i] = 100 + iprint(dic.values())if __name__ == '__main__':temp = Array("i", [11, 22, 33, 44])for i in range(2):p = Process(target=Foo, args=(i, temp,))p.start()for i in temp:print(i)# m = Manager()# dic = m.dict()#
    # for i in range(2):#     p = Process(target=Foo2, args=(i, dic,))#     p.start()#     # join()必须有,因为子进程在运行过程中,主进程已经结束了#     # p.join()# time.sleep(10)

Python的 multiprocessing 模块自带进程池功能,可直接使用:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Pool
import time# 进程池demo
def foo(i):time.sleep(1)return i + " hello"def bar(arg):print(arg)if __name__ == '__main__':pool = Pool(5)# print(pool.apply_async(func=foo, args=(1,)).get())for i in range(10):# 每一个任务是排队进行的, apply()是阻塞的 里面有 进程.join()# pool.apply(foo, (str(i),))# 每一个任务都并发执行, 可以设置回调函数, apply_async()是异步非阻塞的 里面有 daemon = Truepool.apply_async(func=foo, args=("process_" + str(i),), callback=bar)print("11111111111111111111111")print("end")# pool.close()# pool.join()  # 进程池中的进程执行完毕后再关闭,如果注释,那么程序直接关闭

协程gevent简单用法:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from greenlet import greenlet
from gevent import monkey;monkey.patch_all()  # 这一句必须要,猴子补丁
import gevent
import requestsdef foo(url):print("Get: %s" % url)resp = requests.get(url)data = resp.textprint("%d bytes received from %s" % (len(data), url))# 协程可以一次发出多个请求,适用于需要等待的网络I/O操作
gevent.joinall([gevent.spawn(foo, "https://www.python.org/"),gevent.spawn(foo, "https://www.yahoo.com/"),gevent.spawn(foo, "https://github.com/")
])# 协程高级模块gevent
# def foo():
#     print("11111111111")
#     gevent.sleep(0)
#     print("22222222222")
#
#
# def bar():
#     print("33333333333")
#     gevent.sleep(0)
#     print("44444444444")
#
#
# gevent.joinall([
#     gevent.spawn(foo),
#     gevent.spawn(bar),
# ])# 协程模块greenlet, 功能很弱, 一般不用这个, 使用高级模块gevent【基于greenlet】
# def test1():
#     print(12)
#     gr2.switch()
#     print(34)
#     gr2.switch()
#
#
# def test2():
#     print(56)
#     gr1.switch()
#     print(78)
#
#
# gr1 = greenlet(test1)
# gr2 = greenlet(test2)
#
# gr1.switch()

转载于:https://www.cnblogs.com/xiaojiulin/p/10573016.html

Python学习_进程multiprocessing 多进程 协程相关推荐

  1. python中多进程+协程的使用以及为什么要用它

    前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...

  2. 【python】详解multiprocessing多进程-Pool进程池模块(二)

    [python]详解multiprocessing多进程-process模块(一) [python]详解multiprocessing多进程-Pool进程池模块(二) [python]详解multip ...

  3. 进程,线程和协程 并行与并发

    一.进程 进程的出现是为了更好的利用CPU资源使到并发成为可能. 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费.聪明的老大 ...

  4. Day8—进程,线程,协程

    本节内容: 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join.Daeman 线程锁之Lock\Rlock\信号量 Event事件 queue队列 生产者消费 ...

  5. python ui bs_Guibs的Python学习_列表

    Guibs 的 Python学习_列表# 列表# 列表由一系列按特定顺序排列的元素组成, 其中元素和元素之间可以没有任何关系 # 在 Python 中, 用方括号 [] 来表示列表, 并用逗号 , 分 ...

  6. python学习_循环语句

    python学习_循环语句 第1关:斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列. 因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...

  7. python 学习_第五模块 DMO

    python 学习_第五模块 DMO 1. 节点 <!DOCTYPE html> <html lang="en"> <head><meta ...

  8. python爬虫之多线程threading、多进程multiprocessing、协程aiohttp 批量下载图片

    一.单线程常规下载 常规单线程执行脚本爬取壁纸图片,只爬取一页的图片. import datetime import re import requests from bs4 import Beauti ...

  9. python学习第三十二节(进程间通信、进程池、协程)

    当多线程创建完毕之后,start并没有了立刻运行,依旧需要和其他线程抢CPU的资格,只是 时间很短. 进程之间的通信分为两种,queue和pipe 1 import multiprocessing 2 ...

最新文章

  1. json例子(后台取消息)
  2. java填写xls模板_Java 新建excle文件并填充模版内容
  3. src漏洞挖掘|一个谎言需要无数谎言来弥补
  4. Extension project - Component.js of standard application could not be loaded
  5. 图像极坐标变换及在OCR中的应用
  6. Error occurred while trying to proxy request
  7. node截图服务可用性报告
  8. 邱跃鹏:软硬件一体化、Serverless、智能化是云计算三大趋势
  9. 【原】iOSCoreAnimation动画系列教程(二):CAKeyFrameAnimation【包会】
  10. java程卫琴_43名基层工会干部在“机关开放日”走进安徽省总工会参观并座谈
  11. 机器学习基石——作业2解答
  12. 未来十年计算机语言,随便聊聊中国未来十年热门的十大编程语言使用趋势
  13. 苹果屏蔽更新描述文件_iPhone|IOS10-IOS12屏蔽系统更新描述文件|去除设置①小红点教程...
  14. Tip | Git复制粘贴 快捷键
  15. 国内首部创业纪实电影《燃点》进校园:如何靠近成功的2%...
  16. 四大垃圾回收算法七大垃圾回收器
  17. STL 常用容器的底层数据结构
  18. idea gwt 怎么编译_带Spring Boot的GWT
  19. 使用QT发送http/https的post请求并接收服务器reply
  20. java全栈系列之JavaSE-面向对象(异常详解)043

热门文章

  1. 登录oracle sql,登录 Oracle SQL Developer
  2. Node.js webpack 打包的入口与出口
  3. apscheduler Trigger
  4. 图解TCPIP-ARP
  5. MySQL String Types
  6. Java JDBC spring-jdbc
  7. matplotlib color 参数
  8. Openldap 整合windows AD认证
  9. 批量重置指定域用户密码
  10. Python到底能干什么