python并发处理

1.如何使用Python实现并发编程

多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(JS程序员请回避),使用多线程可以有效的利用CPU资源(Python例外)。然而多线程所带来的程序的复杂度也不可避免,尤其是对竞争资源的同步问题。

然而在python中由于使用了全局解释锁(GIL)的原因,代码并不能同时在多核上并发的运行,也就是说,Python的多线程不能并发,很多人会发现使用多线程来改进自己的Python代码后,程序的运行效率却下降了,这是多么蛋疼的一件事呀!如果想了解更多细节,推荐阅读这篇文章。实际上使用多线程的编程模型是很困难的,程序员很容易犯错,这并不是程序员的错误,因为并行思维是反人类的,我们大多数人的思维是串行(精神分裂不讨论),而且冯诺依曼设计的计算机架构也是以顺序执行为基础的。所以如果你总是不能把你的多线程程序搞定,恭喜你,你是个思维正常的程序猿:)

Python提供两组线程的接口,一组是thread模块,提供基础的,低等级(Low Level)接口,使用Function作为线程的运行体。还有一组是threading模块,提供更容易使用的基于对象的接口(类似于Java),可以继承Thread对象来实现线程,还提供了其它一些线程相关的对象,例如Timer,Lock

使用thread模块的例子

import thread

def worker():

"""thread worker function"""

print 'Worker'

thread.start_new_thread(worker)

使用threading模块的例子

import threading

def worker():

"""thread worker function"""

print 'Worker'

t = threading.Thread(target=worker)

t.start()

或者Java Style

import threading

class worker(threading.Thread):

def __init__(self):

pass

def run():

"""thread worker function"""

print 'Worker'

t = worker()

t.start()

2.如何在Python中编写并发程序

GIL 在Python中,由于历史原因(GIL),使得Python中多线程的效果非常不理想.GIL使得任何时刻Python只能利用一个CPU核,并 且它的调度算法简单粗暴:多线程中,让每个线程运行一段时间t,然后强行挂起该线程,继而去运行其他线程,如此周而复始,直到所有线程结束.这使得无法有效利用计算机系统中的"局部性",频繁的线程切换也对缓存不是很友好,造成资源的浪费.据说Python官方曾经实现了一个去除GIL的Python解释器,但是其效果还不如有GIL的解释器,遂放弃.后来Python官方推出了"利 用多进程替代多线程"的方案,在Python3中也有concurrent.futures这样的包,让我们的程序编写可以做到"简单和性能兼得".多进程/多线程+Queue 一般来说,在Python中编写并发程序的经验是:计算密集型任务使用多进程,IO密集型任务使用多进程或者多线程.另外,因为涉及到资源共享,所 以需要同步锁等一系列麻烦的步骤,代码编写不直观.另外一种好的思路是利用多进程/多线程+Queue的方法,可以避免加锁这样麻烦低效的方式.现在在Python2中利用Queue+多进程的方法来处理一个IO密集型任务.假设现在需要下载多个网页内容并进行解析,单进程的方式效率很低,所以使用多进程/多线程势在必行.我们可以先初始化一个tasks队列,里面将要存储的是一系列dest_url,同时开启4个进程向tasks中取任务然后执行,处理结果存储在一个results队列中,最后对results中的结果进行解析.最后关闭两个队列.下面是一些主要的逻辑代码.# -*- coding:utf-8 -*-#IO密集型任务#多个进程同时下载多个网页#利用Queue+多进程#由于是IO密集型,所以同样可以利用threading模块 import multiprocessing def main(): tasks = multiprocessing.JoinableQueue() results = multiprocessing.Queue() cpu_count = multiprocessing.cpu_count() #进程数目==CPU核数目 create_process(tasks, results, cpu_count) #主进程马上创建一系列进程,但是由于阻塞队列tasks开始为空,副进程全部被阻塞 add_tasks(tasks) #开始往tasks中添加任务 parse(tasks, results) #最后主进程等待其他线程处理完成结果 def create_process(tasks, results, cpu_count): for _ in range(cpu_count): p = multiprocessing.Process(target=_worker, args=(tasks, results)) #根据_worker创建对应的进程 p.daemon = True #让所有进程可以随主进程结束而结束 p.start() #启动 def _worker(tasks, results): while True: #因为前面所有线程都设置了daemon=True,故不会无限循环 try: task = tasks.get() #如果tasks中没有任务,则阻塞 result = _download(task) results.put(result) #some exceptions do not handled finally: tasks.task_done() def add_tasks(tasks): for url in get_urls(): #get_urls() return a urls_list tasks.put(url) def parse(tasks, results): try: tasks.join() except KeyboardInterrupt as err: print "Tasks has been stopped!" print err while not results.empty(): _parse(results) if __name__ == '__main__': main() 利用Python3中的concurrent.futures包 在Python3中可以利用concurrent.futures包,编写更加简单易用的多线程/多进程代码.其使用感觉和Java的concurrent框架很相似(借鉴?) 比如下面的简单代码示例 def handler(): futures = set() with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: for task in get_task(tasks): future = executor.submit(task) futures.add(future) def wait_for(futures): try: for future in concurrent.futures.as_completed(futures): err = futures.exception() if not err: result = future.result() else: raise err except KeyboardInterrupt as e: for future in futures: future.cancel() print "Task has been canceled!" print e return result 总结 要是一些大型Python项目也这般编写,那么效率也太低了.在Python中有许多已有的框架使用,使用它们起来更加高效.。

3.如何在Python中编写并发程序

GIL在Python中,由于历史原因(GIL),使得Python中多线程的效果非常不理想.GIL使得任何时刻Python只能利用一个CPU核,并且它的调度算法简单粗暴:多线程中,让每个线程运行一段时间t,然后强行挂起该线程,继而去运行其他线程,如此周而复始,直到所有线程结束.这使得无法有效利用计算机系统中的"局部性",频繁的线程切换也对缓存不是很友好,造成资源的浪费.据说Python官方曾经实现了一个去除GIL的Python解释器,但是其效果还不如有GIL的解释器,遂放弃.后来Python官方推出了"利用多进程替代多线程"的方案,在Python3中也有concurrent.futures这样的包,让我们的程序编写可以做到"简单和性能兼得".多进程/多线程+Queue一般来说,在Python中编写并发程序的经验是:计算密集型任务使用多进程,IO密集型任务使用多进程或者多线程.另外,因为涉及到资源共享,所以需要同步锁等一系列麻烦的步骤,代码编写不直观.另外一种好的思路是利用多进程/多线程+Queue的方法,可以避免加锁这样麻烦低效的方式.现在在Python2中利用Queue+多进程的方法来处理一个IO密集型任务.假设现在需要下载多个网页内容并进行解析,单进程的方式效率很低,所以使用多进程/多线程势在必行.我们可以先初始化一个tasks队列,里面将要存储的是一系列dest_url,同时开启4个进程向tasks中取任务然后执行,处理结果存储在一个results队列中,最后对results中的结果进行解析.最后关闭两个队列.下面是一些主要的逻辑代码.# -*- coding:utf-8 -*-#IO密集型任务#多个进程同时下载多个网页#利用Queue+多进程#由于是IO密集型,所以同样可以利用threading模块import multiprocessingdef main(): tasks = multiprocessing.JoinableQueue() results = multiprocessing.Queue() cpu_count = multiprocessing.cpu_count() #进程数目==CPU核数目 create_process(tasks, results, cpu_count) #主进程马上创建一系列进程,但是由于阻塞队列tasks开始为空,副进程全部被阻塞 add_tasks(tasks) #开始往tasks中添加任务 parse(tasks, results) #最后主进程等待其他线程处理完成结果def create_process(tasks, results, cpu_count): for _ in range(cpu_count): p = multiprocessing.Process(target=_worker, args=(tasks, results)) #根据_worker创建对应的进程 p.daemon = True #让所有进程可以随主进程结束而结束 p.start() #启动def _worker(tasks, results): while True: #因为前面所有线程都设置了daemon=True,故不会无限循环 try: task = tasks.get() #如果tasks中没有任务,则阻塞 result = _download(task) results.put(result) #some exceptions do not handled finally: tasks.task_done()def add_tasks(tasks): for url in get_urls(): #get_urls() return a urls_list tasks.put(url)def parse(tasks, results): try: tasks.join() except KeyboardInterrupt as err: print "Tasks has been stopped!" print err while not results.empty(): _parse(results)if __name__ == '__main__': main()利用Python3中的concurrent.futures包在Python3中可以利用concurrent.futures包,编写更加简单易用的多线程/多进程代码.其使用感觉和Java的concurrent框架很相似(借鉴?)比如下面的简单代码示例def handler(): futures = set() with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor: for task in get_task(tasks): future = executor.submit(task) futures.add(future)def wait_for(futures): try: for future in concurrent.futures.as_completed(futures): err = futures.exception() if not err: result = future.result() else: raise err except KeyboardInterrupt as e: for future in futures: future.cancel() print "Task has been canceled!" print e return result总结要是一些大型Python项目也这般编写,那么效率也太低了.在Python中有许多已有的框架使用,使用它们起来更加高效.。

4.并发和并行的区别 python

并发:就是同时做多件事情。

例如:终端用户程序利用并发功能,在输入数据的同时响应用户输入。服务器利用并发,在处理第一个请求的同时响应第二个请求。只要你希望程序同时做多件事情,就需要并发。

很多人看到“并发”就会想到“多线程”,其实他们是有区别的。多线程只是并发的一种形式,但不是唯一形式

并行:就是把正在执行的大量任务分割成小块,分配给多个同时运行的线程。

一般情况下,为了让CPU充分利用,并行处理都会采用多线程。

所以说:并行处理是多线程的一种,而多线程是并发的一种。

还有一种非常重要但很多人不熟悉的并发类型:异步编程,它也是并发的一种形式。

5.如何优雅的编写Python并发程序

在Python中,由于历史原因(GIL),使得Python中多线程的效果非常不理想.GIL使得任何时刻Python只能利用一个CPU核,并且它的调度算法简单粗暴:多线程中,让每个线程运行一段时间t,然后强行挂起该线程,继而去运行其他线程,如此周而复始,直到所有线程结束.这使得无法有效利用计算机系统中的"局部性",频繁的线程切换也对缓存不是很友好,造成资源的浪费.据说Python官方曾经实现了一个去除GIL的Python解释器,但是其效果还不如有GIL的解释器,遂放弃.后来Python官方推出了"利用多进程替代多线程"的方案,在Python3中也有concurrent.futures这样的包,让我们的程序编写可以做到"简单和性能兼得".多进程/多线程+Queue一般来说,在Python中编写并发程序的经验是:计算密集型任务使用多进程,IO密集型任务使用多进程或者多线程.另外,因为涉及到资源共享,所以需要同步锁等一系列麻烦的步骤,代码编写不直观.另外一种好的思路是利用多进程/多线程+Queue的方法,可以避免加锁这样麻烦低效的方式.现在在Python2中利用Queue+多进程的方法来处理一个IO密集型任务.假设现在需要下载多个网页内容并进行解析,单进程的方式效率很低,所以使用多进程/多线程势在必行。

6.python gevent 能解决并发状态吗

1. gevent.server.StreamServer 会针对每个客户端连接启动一个greenlet处理,要注意的是,如果不循环监听( 阻塞在read ),

每个greenlet会在完成后立即退出,从而导致客户端退出( 发送FIN_ACK给客户端 )。这个问题折腾了一晚上,终于弄明白了。坑爹啊。。

2. 要非常仔细的检查,greenlet处理的代码,发现有可能阻塞IO的地方,尽量用gevent提供的库。

3. 一些第三方库隐藏了自己的实现( 通常是直接封装C库),要使得gevent兼容它们,可以用monkey_patch,但不保证全部管用。

4. 最后最后的一点,gevent的greenlet性能非常高,所以如果是用它作为并发的client端,那么一定要注意,你的server端处理速度一定要足够快!

否则你的客户端代码会因为服务端的慢速,而失去了greenlet的优势。

python并发处理

转载请注明出处编程代码网 » python并发处理

资讯

python的效率低

阅读(6)

本文主要为您介绍python的效率低,内容包括python为什么效率低,python为什么效率低,Python语言运行效率低意味着什么。当我们提到一门编程语言的效率时:通常有两层意思,第一是开发效率,这是对程序员而言,完成编码所需要的时间;另一个是运行效率,这

资讯

python灰帽子pdf

阅读(6)

本文主要为您介绍python灰帽子pdf,内容包括python灰帽子看之前需要什么基础,python灰帽子看之前需要什么基础,我想成为一名黑客,我在学python,可是里面讲的多是游戏设计,能否。学习是循序渐进的过程最常见的有两本python和黑客相关的书《py

资讯

pythondistribute

阅读(6)

本文主要为您介绍pythondistribute,内容包括pythondistribute怎么安装,求助python2.7.9的distribute安装问题,注意,选取pythonsetuptools而非pythondistributeUbun。首先配置安装好各种python3运行编译环境,然后在https://去掉中间的中文pypi

资讯

python右移

阅读(6)

本文主要为您介绍python右移,内容包括python怎样实现无符号右移,python循环的的结果如何像右移,python左移运算符困扰。是移位运算符,<&gt;是右移位。左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补

资讯

python安装pyqt5

阅读(6)

本文主要为您介绍python安装pyqt5,内容包括如何安装python3pyqt5,pythonpyqt5怎么安装,PyQt5怎么安装。方法/步骤下载版本:PyQt5-5.4.1-gpl-Py3.4-Qt5.4.1-x64.exe 里面有个py3.4,不知道是不是一定要版

资讯

python爬虫博客

阅读(6)

本文主要为您介绍python爬虫博客,内容包括python抓取csdn博客内容怎么实现,怎么利用python爬取csdn博客访问量例子,如何用Python爬虫获取那些价值博文。怎么利用python爬取csdn博客访问量例子webpy: 轻量级的Python Web框架webpy的设计理念

资讯

python初始化字典

阅读(7)

本文主要为您介绍python初始化字典,内容包括如何初始化一个字典与列表和空值在Python中的钥匙,如何初始化一个字典与列表和空值在Python中的钥匙,python字典中如何创建字典。1. dict.fromkeys([1, 2, 3, 4])这实际上是一个所以它适用于字典

资讯

python执行速度

阅读(5)

本文主要为您介绍python执行速度,内容包括Python语言为什么执行速度相当慢不是一般的慢,python运行速度慢怎么办,Python执行速度慢只是因为它是解释型语言吗。java和c都是编译型语言,一个是解释型语言。编译型语言在程序执行之前,有一个单独

资讯

python.any

阅读(8)

本文主要为您介绍python.any,内容包括pythonanyall有什么用,pythonanyall有什么用,pythonint什么意思。all是如果iterable的所有元素不为0、、False或者iterable为空,all(iterable)返回True,否则返回Fa

资讯

submitpython

阅读(7)

本文主要为您介绍submitpython,内容包括python爬虫怎么处理submit,submittext3里的Python.zip怎么用来编译Python?,Python问题:findElement()。问题:怎样使用表单 forms解决:web.form模块提供支持创建,校验和显示表单。这里是一个新用户注册的

资讯

python调用so

阅读(6)

本文主要为您介绍python调用so,内容包括python怎么调用so文件,python可以调用.so或.a库吗,python怎么调用安卓的.so文件。当需要采用调用c++的程序的时候,需要对原有的数据加一个extern "C"封装一下即可。采用g++编译的代码也需要的,原因可能是

资讯

mac卸载python

阅读(7)

本文主要为您介绍mac卸载python,内容包括Mac上的Python怎么卸载,Mac上的Python怎么卸载,mac上怎么卸载python。Sublime Text 2 依赖这个路径,所以可能无法启动。解决方法:从官方下载Python2.x,安装,然后做一个软链接前提:2.6

资讯

fedora安装python

阅读(8)

本文主要为您介绍fedora安装python,内容包括fedora15下python怎么安装,fedora15下python怎么安装,fedora如何运行python。1.下载源代码 http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz22

资讯

pythonforrhino

阅读(7)

本文主要为您介绍pythonforrhino,内容包括pythonforRhino中,not和None的区别,请问谁有grasshopper里的pythonforrhino和starling?,如何用pytho写rhino文件。没理解错的话。。应该只是Python的基本语法吧。not是逻辑运算符,表示逻辑非。None

资讯

python的效率低

阅读(6)

本文主要为您介绍python的效率低,内容包括python为什么效率低,python为什么效率低,Python语言运行效率低意味着什么。当我们提到一门编程语言的效率时:通常有两层意思,第一是开发效率,这是对程序员而言,完成编码所需要的时间;另一个是运行效率,这

资讯

python灰帽子pdf

阅读(6)

本文主要为您介绍python灰帽子pdf,内容包括python灰帽子看之前需要什么基础,python灰帽子看之前需要什么基础,我想成为一名黑客,我在学python,可是里面讲的多是游戏设计,能否。学习是循序渐进的过程最常见的有两本python和黑客相关的书《py

资讯

pythondistribute

阅读(6)

本文主要为您介绍pythondistribute,内容包括pythondistribute怎么安装,求助python2.7.9的distribute安装问题,注意,选取pythonsetuptools而非pythondistributeUbun。首先配置安装好各种python3运行编译环境,然后在https://去掉中间的中文pypi

资讯

python右移

阅读(6)

本文主要为您介绍python右移,内容包括python怎样实现无符号右移,python循环的的结果如何像右移,python左移运算符困扰。是移位运算符,<&gt;是右移位。左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补

资讯

python安装pyqt5

阅读(6)

本文主要为您介绍python安装pyqt5,内容包括如何安装python3pyqt5,pythonpyqt5怎么安装,PyQt5怎么安装。方法/步骤下载版本:PyQt5-5.4.1-gpl-Py3.4-Qt5.4.1-x64.exe 里面有个py3.4,不知道是不是一定要版

资讯

python爬虫博客

阅读(6)

本文主要为您介绍python爬虫博客,内容包括python抓取csdn博客内容怎么实现,怎么利用python爬取csdn博客访问量例子,如何用Python爬虫获取那些价值博文。怎么利用python爬取csdn博客访问量例子webpy: 轻量级的Python Web框架webpy的设计理念

资讯

python初始化字典

阅读(7)

本文主要为您介绍python初始化字典,内容包括如何初始化一个字典与列表和空值在Python中的钥匙,如何初始化一个字典与列表和空值在Python中的钥匙,python字典中如何创建字典。1. dict.fromkeys([1, 2, 3, 4])这实际上是一个所以它适用于字典

资讯

python语言类型

阅读(7)

本文主要为您介绍python语言类型,内容包括python是什么类型的语言,Python是什么类型的语言,python的数据类型。说到python相信对写程序的人来说非常熟悉,因为python应用的很广,关于模型的修改,而python语言可以在最短的时间来实现,关于

资讯

python读取汉字

阅读(2)

本文主要为您介绍python读取汉字,内容包括python读取的中文怎么使用,python怎么读取文本中的汉字,python怎么读取文本中的汉字。在python脚本的第一行加上#encoding=utf-8即可。程序如下:Created on 2011-9-24@author: l

资讯

python数组行列

阅读(2)

本文主要为您介绍python数组行列,内容包括python3如何把由坐标构成的一维数组转换成行列分别为xy值的二维数组,python中怎样让数据列转置,python怎么输入一个数组矩阵。需求:你需要转置一个二维数组,将行列互换.讨论:你需要确保该数组的行列数

资讯

跳板机python

阅读(2)

本文主要为您介绍跳板机python,内容包括如何直接通过跳板机ssh到服务器,如何无视跳板机,如何直接通过跳板机ssh到服务器。公司连上远程游戏服需要先ssh登到跳板机,再在跳板机上ssh到远程,不能直连,如:自己的系统(Mac OS) ===&gt; 跳板机 =

资讯

python公开课

阅读(2)

本文主要为您介绍python公开课,内容包括Python教学视频实用型的哪里有,哪的Python视频教程比较好,有什么比较好的Python学习教程。随着人工智能时代呼声渐起,Python凭借其入门简单、应用广泛的优势成为很多想要入行互联网行业的人们的首选编

资讯

python二进制文件读取

阅读(2)

本文主要为您介绍python二进制文件读取,内容包括在python中如何从二进制文件中读取信息,在python中如何从二进制文件中读取信息,python二进制文件的读取与写入可以分别使用和方法。你是指读入二进制文件吧?可以使用numpy.fromfile(),也可以使

资讯

python黑客pdf

阅读(2)

本文主要为您介绍python黑客pdf,内容包括为什么很多关于python的黑客书,我想成为一名黑客,我在学python,可是里面讲的多是游戏设计,能否,求黑客书籍资源。学习是循序渐进的过程最常见的有两本python和黑客相关的书《python灰帽子:黑客与逆向

资讯

pythonexcel中文

阅读(2)

本文主要为您介绍pythonexcel中文,内容包括python怎么读excel中文,python怎么将中文写入excel文档,python怎么输出中文文件名excel。简单的介绍一下这两个库,先说xlrd,这个库读excel比较方便,各种方法使用起来也挺方便:bk = xlrd.open_workboo

资讯

apachepythonlinux

阅读(2)

本文主要为您介绍apachepythonlinux,内容包括请教一个关于linux下APACHE关于PYTHON的设置问题,linux配置apache和python的环境,modpython在安装的报错处理,在线,如何在Apache下设置Python。二、linux下apache配置python 一.安装apache apac

资讯

chainPython

阅读(2)

本文主要为您介绍chainPython,内容包括ord在python是什么意思怎么使用,Python大神解释一下吧,python中round函数怎么用。>>>help(ord)Help on built-in function ord in module builtins:ord() #

资讯

python添加一行

阅读(2)

本文主要为您介绍python添加一行,内容包括python怎么实现数组增加一行或多行,python如何将字符串增加一行,python怎么实现数组增加一行或多行。把文档全部作为一个字符串,字符串可以相加, 如在1.doc里添加s 和d,用>>>file=open(1.doc,r)>>>str