文档章节

学习python多线程和多进程的一点感想

刘地
 刘地
发布于 2012/11/12 00:25
字数 840
阅读 3410
收藏 41

今天学了一下python的多进程和多线程技巧。

多线程方面倒没啥可说的,很简单。值得注意的是,多线程并不限制你一次只执行一个,如果你的线程之间不共享变量的话,是用不到线程锁的,虽然这么说,但是其实即使不用lock程序还是一次只执行一个线程。如果程序内部有阻塞现象(比如下载之类),使用线程很不错,但是如果没有的话,用不用线程的消耗差别不大(甚至因为要支持线程而减慢)。不使用lock其实是将lock交给了python负责,它会根据阻塞与否协调线程的执行。

说回重点,多进程吧。

下面是我从其他人的帖子里抄来的一个多进程示范脚本(当然修改了一些):

import multiprocessing
import os

def get(url,lock):
    lock.acquire()
    print os.getpid(),url
    lock.release()

plist=[]
lock=multiprocessing.Lock()
for i in ['www.sina.com.cn','www.163.com','www.baidu.com','www.cnblogs.com','www.qq.com','www.douban.com']:
    proc=multiprocessing.Process(target=get,args=(i,lock))
    plist.append(proc)

for proc in plist: proc.start()
for proc in plist: proc.join()


但是呢,我执行起来,却会死机,会不停的打开python解释程序。

这样当然是让我很纳闷的,因为这个程序在ideone(一个在线代码编译器)上运行正常,问别人也说可以正常执行,怎么到我这里就不行了呢?

起初我以为是安装非标准模块的副作用,于是重装了一次python2.7.3,然后从网上找了另一个范例试了一下,ok。

我很高兴,以为解决问题了,不过为了保险,还是再实验了一下上面的代码,又挂了……

这就让我很郁闷了,看来原因不是python,还是代码的问题。

可是代码成功执行了啊……

这个时候,我注意到一个细节,那就是在代码存放的目录里,多出来一个字节码的pyc文件。

看来这个pyc文件应该和这一问题有关……原来如此!

我安装python的时候,是选择了预编译库文件选项的,这样可以加快代码的执行速度。不过这样就导致了一个问题:预编译后的字节码文件的代码顺序和源代码文件是不太一样的。装入字节码文件时,会自动执行pyc文件里的部分代码(就是那些贴左面放的部分),而这一执行,就会导致程序发生递归,结果就是不断启用python解释执行pyc文件……

然后,然后俺就死机了……

ok,那么我就按我的判断来修改一下吧,代码如下:

from multiprocessing import Process
import os

def myget(url):
	print os.getpid(),url

if __name__ == '__main__':
	plist=[]
	for i in ['www.sina.com.cn','www.163.com','www.baidu.com','www.cnblogs.com','www.qq.com','www.douban.com']:
		proc=Process(target=myget,args=(i,))
		plist.append(proc)
	for proc in plist: proc.start()
	for proc in plist: proc.join()

下面一句:

if __name__ == '__main__':


的作用是让后面的代码只有文件被作为程序执行时才有效,作为库加载时不执行。

结果很好,成功执行了代码。

这一事例告诉我们,python官方的代码格式并不是仅仅出于美观的,尽可能的按官方风格写,可以避免很多不可预料的错误。

© 著作权归作者所有

共有 人打赏支持
刘地
粉丝 100
博文 52
码字总数 69858
作品 1
朝阳
加载中

评论(1)

王阿觉
王阿觉
学习一下,以后可以交流。
他学习一年Python找不到工作,大佬都说你别再学Python了!

都说,滴水穿石非一日之功。然而有些人即使奋斗一辈子也比不上别人一年,别人学习一年比不得你学习一个月。其中缘由,有些人看了大半辈子还没看明白。 即使Python这么火,为何你学习一年的P...

柯西带你学编程
06/06
0
0
python标准库00 学习准备

Python标准库----走马观花 python有一套很有用的标准库。标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以让编程事半功倍....

肖邦0526
2015/12/29
0
0
给你的Python爬虫穿上风火轮(多进程), 架起筋斗云(多线程)!

PS:使用多线程时好像在目录切换的问题上存在问题,可以给线程加个锁试试 Hello 大家好!我又来了。 你是不是发现下载图片速度特别慢、难以忍受啊!对于这种问题 一般解决办法就是多进程了...

Python新世界
08/07
0
0
Python 2.6 亮点:multiprocessing模块

本来以为Python 2.6只是Python 3.0的过渡版本,不会有太多的新功能。但看到这个2.6的重大改动列表,才发现自己挺落后的。在2.6中新增的multiprocessing模块也绝对是Python 2.6的杀手级应用(...

索隆
2012/05/02
0
0
Python的全局解释器锁(GIL)

转一篇关于Python GIL的文章。 归纳一下,CPU的大规模电路设计基本已经到了物理意义的尽头,所有厂商们都开始转向多核以进一步提高性能。Python为了能利用多核多线程的的优势,但又要保证线程...

seancheney
2017/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
26分钟前
1
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
7
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
0
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
0
0
JAVA 内存回收

参考:https://www.cnblogs.com/leesf456/p/5218594.html 1,JMV 中哪些可以作为 GC Root? 1. 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。 2. 方法区中的类静态属性引...

Carlyle_Lee
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部