25 May 2015

GIL全称Global Interpreter Lock(全局解释器锁),它是在实现Python解析器(CPython)时所引入的一个概念。但是它并不是Python的特性。Python是一种语言,它有自己的语法等规范,根据其实现的不同有Cpython, Jython等等,CPython是使用C语言编写Python以及相关的解释器,Jython是用Java来编写的。Python完全可以不依赖于GIL,比如说JPython解析器就没有GIL。因为大部分环境下Python执行环境默认为CPython,许多人便把GIL归结为Python的特性。

在Python的wiki中是这样定义GIL的:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)   翻译过来也就是说,GIL是一个互斥锁用来防止多个线程并发执行Python字节码,这把锁存在原因是CPython的内存管理不是线程安全的(因为GIL的存在其他一些功能已经习惯并依赖于它了)。如果你想要摆脱GIL的束缚,可以使用多进程(multiprocess库)来实现你的代码。   由于GIL的存在导致在任何时刻只有一个线程在执行,但是这并不意味着多线程编程在Python中一无是处,当爬虫的多个线程的其中一个在爬取网站时阻塞在等待服务器的响应时,其他线程的任务便可以利用阻塞任务等待的时间进行其他操作以提高效率。操作数据库时也存在同样的问题,有可能你需要等待数据库返回的结果,在等待期间你可以利用这段时间做其它的一些操作。下面我给出了一个多线程的最基本的框架,当我们实现了单个线程的程序之后,直接移植过来即可,同时还需要考虑到多线程可能会出现的问题,比如你的操作是否是原子操作,这些在后面详细设计中都会详细的介绍。这里给出一个最简单的多线程实现的框架,首先构造一个队列,将参数入队,新建若干线程,线程从队列中获取参数然后执行响应的操作,最后等待所有任务完成之后退出:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import threading

import Queue

import time

import sys

reload(sys)

sys.setdefaultencoding('utf8')

q = Queue.Queue() #构造一个不限制大小的的队列

thread_num = 10 #设置线程的个数

#具体的处理函数,负责处理单个任务

def do_somthing_using(arguments):

print arguments

def worker():

global q

while not q.empty():

arguments = q.get()

do_somthing_using(arguments)

time.sleep(1)

q.task_done()

def main():

global q

threads = []

for index in xrange(10):

q.put(index)

for i in xrange(thread_num):

thread = threading.Thread(target=worker)

# 线程开始处理任务

thread.start()

threads.append(thread)

# 等待线程池中的线程全部结束

for thread in threads:

thread.join()

# 等到队列为空,再执行下面的操作

q.join()

if __name__ == '__main__':

start = time.clock()

main()

end = time.clock()

print "共花费:%f s" % (end - start)

除了使用threading+Queue的方法实现多线程,还有种更简单的方法:map,使用map可以通过几行代码就实现并行化。感兴趣的同学可以参考《一行 Python 实现并行化 – 日常多线程操作的新思路》这篇文章。

在Python中有个两个库包含了map函数: multiprocessing和它的子库multiprocessing.dummy。dummy是multiprocessing模块的完整克隆,唯一的不同在于multiprocessing作用于进程,而dummy模块作用于线程(因此也包括了Python所有常见的多线程限制),所以替换使用这两个库非常容易。

map使用起来相当简单,下面的例子介绍下map的简单使用,首先通过ThreadPool创建线程池,它决定了你的线程池中线程的数目,默认值为当前机器CPU的核数,通过map函数就可以将参数序列中的参数分配到每个线程对应的执行函数中去,map函数的返回值是一个列表,记录了每个线程执行完任务函数返回的结果。

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import time

import sys

from multiprocessing.dummy import Pool as ThreadPool

reload(sys)

sys.setdefaultencoding('utf8')

#具体的处理函数,负责处理单个任务

def do_somthing_using(arguments):

print arguments

time.sleep(1)

return arguments

def run():

# 创建线程池

pool = ThreadPool(5)

# 将第list中的每个元素作为参数传递到do_somthing_using方法中

# 并将所有结果保存到results这一列表中。

list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

results = pool.map(do_somthing_using, list)

# 调用join之前先调用close函数,否则会出错

# 执行完close后不会有新的进程加入到pool,join函数等待所有线程结束

pool.close()

pool.join()

if __name__ == '__main__':

start = time.clock()

run()

end = time.clock()

print "共花费:%f s" % (end - start)

python豆瓣电影需研究的问题_python爬虫获取豆瓣电影——多线程问题相关推荐

  1. python爬取豆瓣电影top250并保存为xlsx_python 爬虫获取豆瓣电影排行榜前250并写入excel...

    豆瓣电影排行榜前250 分为10页,第一页的url为https://movie.douban.com/top250,但实际上应该是https://movie.douban.com/top250?sta ...

  2. python豆瓣图书源代码没有title怎么办_Python爬虫(一)——豆瓣下图书信息

    1 wber@wber:~/桌面$ tree -h 数据2 数据3 ├── [4.0K] 经管4 │   ├── [ 41K] 策划.csv5 │   ├── [ 79K] 创业.csv6 │   ├ ...

  3. 使用Python爬虫获取豆瓣影评,并用词云显示

    使用Python爬虫获取豆瓣影评,并用词云显示 Python语言流行到现在,目前最受开发者喜爱的功能莫过于它的爬虫功能,以至于很多人以为Python的英语发音也是"爬虫",其实它是 ...

  4. python爬虫获取豆瓣图书Top250

    在上一篇博客<python爬虫获取豆瓣电影TOP250>中,小菌为大家带来了如何将豆瓣电影Top250的数据存入MySQL数据库的方法.这次的分享,小菌决定再带着大家去研究如何爬取豆瓣图片 ...

  5. Java爬虫获取豆瓣的短评数据

    Java爬虫获取豆瓣的短评数据 打开豆瓣的选电影页面的链接,可以看到该网页的下面分为热门,最新,经典等栏目分类,网页每次显示20部电影,通过几部电影的查看,可以发现电影的短评页https://movi ...

  6. 利用爬虫获取猫眼电影热门前100数据

    利用爬虫获取猫眼电影热门前100数据 实现方法 1:访问网站,获取页面源码 2:解析页面 ,得到想要的数据 3:循环爬取多个页面 4:把数据写入本地文件 ''' 需求:爬取猫眼电影前100的电影信息 ...

  7. python豆瓣电影需研究的问题_基于Python对豆瓣电影数据爬虫的设计与实现

    本文基于 Python 实现了网络 爬虫豆瓣电影模块的数据信息, 可以根据爬虫得到的信息进行相 关的市场分析,具有一定的商业 价值. 摘 要 能够高效率得完成爬取目标数据. 2 网络爬虫的实现 本 文 ...

  8. xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验

    影评许可证 公众号[2019]第22期 本栏目由"数据皮皮侠"独家呈献 专场 python爬虫实战--豆瓣电影get初体验 2019.10.28 / 早上7点场 / 免费 本期&q ...

  9. python爬虫获取豆瓣TOP25电影名称和评分

    import requests import lxml.html myheaders = {"User-Agent": "Mozilla/5.0 (Windows NT ...

最新文章

  1. uart口图片_认识UART接口
  2. pandas 索引与列相互转化
  3. 邻接矩阵和邻接表_[力扣743] 带权邻接表的单源最短路
  4. MATLAB定时器的简单使用
  5. Linux ssh shell 自动登录,shell脚本实现ssh自动登录功能分享
  6. 黑色沙漠单机一键端服务器维护,《黑色沙漠》网游单机版一键服务端
  7. MyBatis的XML配置文件(一)
  8. 曲奇云盘资源搜索引擎_曲奇云盘下载-曲奇云盘资源共享群组下载_快啦网
  9. ADC学习(2)——频谱性能指标
  10. 雄迈摄像头研究笔记一:telnet的开启
  11. HHL论文及代码理解(Generalizing A Person Retrieval Model Hetero- and Homogeneously ECCV 2018)...
  12. STM32学习之红外遥控
  13. win7文件夹加密_小编还原win7系统文件夹加密码的步骤
  14. 去除csdn博客上的图片水印
  15. 装服务器系统时无法找到介质,服务器安装介质未找到
  16. 原理 一篇文章通透理解序列号实现原理
  17. Java代理模式(Cglib)代理模式
  18. 红利逐渐消失殆尽的互联网下半场,前路何方?
  19. 英语的加减乘除怎么计算机,用英语表示加减乘除法的用法
  20. 基于汇编语言实现的彩色黑白棋游戏

热门文章

  1. 2022-20228年中国露营行业市场研究及前瞻分析报告
  2. 《庄子》故事(1) 逍遥游 之 尧让天下
  3. 【刷题记录】【一维数组】魔术师的猜牌术。
  4. 开发者该如何抓住微信小游戏的风口?听Cocos创始人王哲详解(上篇)
  5. 使用CSS网格布局放置元素的七种方法
  6. Word文件交换的电脑打开字体、排版变化的原因和解决方法!
  7. SAP MASS批量更新(Mass Maintenance)工具对象类型介绍
  8. Linux系统小惊喜:开往2022虎年的小火车
  9. 视频去水印免费软件有哪些?视频去水印软件大分享
  10. 用Python实现栅格计算器中的Con和Power