Python学习_进程multiprocessing 多进程 协程
进程的简单用法:
#!/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 多进程 协程相关推荐
- python中多进程+协程的使用以及为什么要用它
前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...
- 【python】详解multiprocessing多进程-Pool进程池模块(二)
[python]详解multiprocessing多进程-process模块(一) [python]详解multiprocessing多进程-Pool进程池模块(二) [python]详解multip ...
- 进程,线程和协程 并行与并发
一.进程 进程的出现是为了更好的利用CPU资源使到并发成为可能. 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费.聪明的老大 ...
- Day8—进程,线程,协程
本节内容: 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join.Daeman 线程锁之Lock\Rlock\信号量 Event事件 queue队列 生产者消费 ...
- python ui bs_Guibs的Python学习_列表
Guibs 的 Python学习_列表# 列表# 列表由一系列按特定顺序排列的元素组成, 其中元素和元素之间可以没有任何关系 # 在 Python 中, 用方括号 [] 来表示列表, 并用逗号 , 分 ...
- python学习_循环语句
python学习_循环语句 第1关:斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列. 因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...
- python 学习_第五模块 DMO
python 学习_第五模块 DMO 1. 节点 <!DOCTYPE html> <html lang="en"> <head><meta ...
- python爬虫之多线程threading、多进程multiprocessing、协程aiohttp 批量下载图片
一.单线程常规下载 常规单线程执行脚本爬取壁纸图片,只爬取一页的图片. import datetime import re import requests from bs4 import Beauti ...
- python学习第三十二节(进程间通信、进程池、协程)
当多线程创建完毕之后,start并没有了立刻运行,依旧需要和其他线程抢CPU的资格,只是 时间很短. 进程之间的通信分为两种,queue和pipe 1 import multiprocessing 2 ...
最新文章
- json例子(后台取消息)
- java填写xls模板_Java 新建excle文件并填充模版内容
- src漏洞挖掘|一个谎言需要无数谎言来弥补
- Extension project - Component.js of standard application could not be loaded
- 图像极坐标变换及在OCR中的应用
- Error occurred while trying to proxy request
- node截图服务可用性报告
- 邱跃鹏:软硬件一体化、Serverless、智能化是云计算三大趋势
- 【原】iOSCoreAnimation动画系列教程(二):CAKeyFrameAnimation【包会】
- java程卫琴_43名基层工会干部在“机关开放日”走进安徽省总工会参观并座谈
- 机器学习基石——作业2解答
- 未来十年计算机语言,随便聊聊中国未来十年热门的十大编程语言使用趋势
- 苹果屏蔽更新描述文件_iPhone|IOS10-IOS12屏蔽系统更新描述文件|去除设置①小红点教程...
- Tip | Git复制粘贴 快捷键
- 国内首部创业纪实电影《燃点》进校园:如何靠近成功的2%...
- 四大垃圾回收算法七大垃圾回收器
- STL 常用容器的底层数据结构
- idea gwt 怎么编译_带Spring Boot的GWT
- 使用QT发送http/https的post请求并接收服务器reply
- java全栈系列之JavaSE-面向对象(异常详解)043