Python并发编程(上)进程模块multiprocessing模块和Process类
Python中为什么要用多进程编程?
由于Python解释器中使用了内部的GIL全局解释器锁,使得Python多线程的并发在任意时刻只允许单个CPU来运行,这样的运行方式会影响程序的并发。
当程序是在I/O密集时,CPU可能会有更多的空闲处理多线程的并发,这种情况下一般是没有问题的。如果是大量计算密集型的应用,如果使用多线程来并发,性能会大大降低,这个时候,我们就得考虑使用进程Process来进行编程及通信了。
创建进程Process(方法1)
import time, os
from multiprocessing import Process
def clock(x,y):
for i in range(x):
print('当前时间=={0}'.format(time.ctime()))
time.sleep(y)
if __name__ == '__main__':
p = Process(target=clock,args=(5,1))
p.start()
p.join()
创建进程Process(方法2)
import time, os
from multiprocessing import Process
class ClockProcess(Process):
def __init__(self,x,y):
Process.__init__(self)
self.x=x
self.y=y
def run(self):
for i in range(self.x):
print('{0}=={1}'.format(os.getpid(),time.ctime()))
time.sleep(self.y)
if __name__ == '__main__':
p = ClockProcess(5,1)
p1= ClockProcess(5,1)
p.start()
p1.start()
p.join()
p1.join()
通过Process类创建实例,然后传函数创建进程,另一种是继承Process类,然后重写run()方法创建要执行的任务。
进程池 Pool(方法3)
from multiprocessing import Pool
import os
def clock(k):
for i in range(k):
print('{0}当前时间=={1}'.format(os.getpid(),time.ctime()))
time.sleep(k)
if __name__ == '__main__':
l = [1 for i in range(20)]# 列表推导出一个列表对象
with Pool(5) as p:
p.map(clock,l)
进程池方便创建多进程进行操作,创建使用也是比较简单的,使用时可以根据应用场景对线程的控制要求来选择线程的创建方式。
线程间的通信
Python为线程提供了Queue、Pipes等多种方式来交换数据,我们以Queue为例来演示学习一下进程间的通信及协作,稍后我们还要做分布式多进程的演示。
Queue进程间通信演示:
import multiprocessing as mp
import time, os
from queue import Queue
def prt_q(q):
'''消费者打印数据'''
while True:
v = q.get()
print(v)
time.sleep(0.1)
def wrt_q(q):
'''生产者添加数据'''
for k in ['aa','bb','cc','dd','ee','ff','gg']:
print("{0}已经加入到队列中".format(k))
q.put(k)
time.sleep(0.2)
if __name__ == '__main__':
q = Queue()
wrt_q(q)
p = mp.Process(target=prt_q, args=(q,))
p.start()
p.join()
Queue的使用其实就是生产者与消费者的模式,上边的代码运行后会有死锁,请按ctrl+c强制停止程序运行。
Python的进程有个很强大的地方,就是通过简单的配置就可以进行分布式多进程,这点是很吸引人的,稍后我会有一个篇幅来介绍一下分布式多进程。
本文源码下载:
标签: Python基础
相关文章
- 解决错误 ERROR [WinError 10049] 在其上下文中,该请求的地址无效。
- 如何在Python程序中使用配置文件.ini(ConfigParser)
- Python os.mknod 运行报错无法创建文件
- Python os.path.dirname(__file__) 在终端命令行下报错
- 聊聊Python中的递归与快速排序那点事
- 妙用IPython学习Python--IPython快速上手
- Python生成器yield应用实例——监控日志
- 如何快速的复习学习过的Python
- python中导入不同目录中的自定义模块/class/函数/方法
- 浅谈Python中的协程及利用协程代替多线程及多进程并发编程
- 聊聊Python中晦涩的生成器(yield)与生成器表达式
- Python中创建TCP服务器与客户端进行通信(下)Tk、thread与socket组合。
- Python中创建TCP服务器与客户端进行通信(上)
- Python程序在Windows10终端运行中文乱码解决方法
- 你与黑客之间差了多少行Python代码?
- 聊聊Python闭包(Closure)的那点事。
- Python并发编程(下)功能强大设置简单的分布式多进程生产者与消费者模式
- Python多线程编程(下)多线程锁 threading.Lock
- Python多线程编程(上)多线程创建的几种方法
- python 类的静态方法和类方法
- Python面向对象编程(OOP)初探
- Python random 随机数模块操作总结
- Python3 datetime模块的时间操作
- python3函数学习笔记简单总结
- PythonINI配置文件读写的简单方法
- Python open()函数文件打开、读、写操作总结
- Python os.path模块中一些常用方法的整理总结
- Python 采集数据三步曲之[Requests + re.py模块进行数据采集]
- Python 采集数据三步曲之[Requests开源协议的HTTP 库]
- Python 采集数据三步曲之[正则表达式 re.py]
- python3 Markdown模块解析Markdown代码
- 创建python 虚拟环境 venv