文档章节

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

刘地
 刘地
发布于 2012/11/12 00:25
字数 840
阅读 3401
收藏 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
linux多线程网页截图-python

上一篇中(linux多线程网页截图-shell),使用shell多进程对大量的网站截图,大大减少了截图的时间。但慢慢的也发现了这种方式的弊端:每个进程分配的网站数量是相等的,有些进程截图较快,有...

cszer
2013/06/14
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kernel version does not match DSO version

错误信息: kernel version 384.11 does not match DSO version 384.130.0 原因是: cuda driver版本太低,不匹配DSO 简单有效的修复方法,升级nvidia driver, 步骤如下: 1. google seach ...

刘小米
今天
0
0
maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部