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. JavaMail API 概述
  2. c语言和其他高级语言一样也要经过编译,C语言和其他高级语言的最大的区别是什么?...
  3. C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
  4. 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)...
  5. codesmith使用的一个小问题
  6. 自动Shader优化器glsl_optimizer的编译与使用
  7. C++的类为什么要用指针
  8. 青岛农行开始推广数字人民币钱包
  9. 《『若水新闻』客户端开发教程》——05.设计新闻列表UI
  10. linux内存的active,Linux性能优化和监控系列(三)——分析Memory使用状况
  11. jsf初学解决faces 中文输入乱码问题
  12. Selenium-鼠标操作
  13. Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
  14. (1) IFC格式简介 (Industry Foundation Class)
  15. 微信表情商店视频动态暂停使用 6日恢复
  16. 形象理解数字证书的基本安全功能
  17. Spring Boot项目@RunWith注解报错
  18. 特征工程 特征选择 reliefF算法
  19. 基于Vue实现微前端
  20. delphi 2007 安装提示Invalid Serial Number 超强解决办法

热门文章

  1. 8款电子邮件客户端比较【转】
  2. unity图片变成马赛克如何取像素并改变颜色_聊聊 2D 游戏的像素化中的问题
  3. 如何使用iMacros自动化重复的网页浏览器任务
  4. Win10系统的引导区安装在了机械硬盘,系统安装在了固态硬盘,拔掉机械硬盘后无法开机的解决办法
  5. 使用CSS网格布局放置元素的七种方法
  6. 在Windows下安装苹果系统内含Xcode5.1.1(大学课程《iphone应用开发》))
  7. 互联网晚报 | 8月16日 | iPhone14或仍有刘海;​百度回应前腾讯新闻负责人王诗沐是否加入;微信聊天对话框支持放大编辑...
  8. 高可用架构的技术变迁与演进经历了怎样的过程?
  9. Windows7 IIS7.5部署ASP网站
  10. 职业“小三劝退师”,真的能拯救你的婚姻吗?