话说Python(六)小白的胜利
“哈哈!知道我操作之王小白的厉害了吧!”
每当周六晚上,小白总是要跟宿舍的弟兄挑几局魔兽。凭借着风骚的走位和猥琐的意识,小白总是笑道最后。这不,小白又一次取得了以一敌二的胜利。
“主要是多线操作!”这是小白对自己胜利的总结。
今天我们就要学习多线程,看看小白是怎样胜利的。
首先我们要澄清的是Python的多线程并不是利用系统本身的多线程机制,而是基于Python解释器,实际在系统看来还是一个线程。在Python中,存在一个Global Interpreter Lock(GIL),即全局解释器锁,它的作用在于让同一时刻只能有一个线程对于python对象进行操作。所以Python的多线程无法充分利用多核CPU,甚至单核CPU,这可以说是解释语言的通病。有时可以通过创建多个进程(而不是线程),或者使用Jython版本来解决。
多线程带来的缺点:1、代码编写难度加大,多线程之间的抢占容易产生错误,出现异常;2、线程之间的切换同样会加大CPU和内存的负担。
无论如何,多线程还是值得一学的,因为它有一个不可忽视的优点:执行速度快,切记不能滥用。多线程主要应用在I/O密集型的程序中,因为在输入输出函数会更多地调用内建的C级代码,而不是Python级代码。
我们要学习的模块是threading,而不是thread,因为threading更为高级。推荐使用继承threading.Thread类来创建线程。
hello world 线程版:
import threading
class WorkerThread(threading.Thread): #继承自Thread
def __init__(self):
threading.Thread.__init__(self) #继承Thread构造函数
def run(self): #重写run()函数
print("hello world!")
if __name__=="__main__":
myThread=WorkerThread() #创建对象
myThread.start() #start()方法会自动运行run()
调用start()方法后,线程就会自动运行,连续创建多个对象就会变成多线程。
上文提到,多线程的一个缺点是对共享的数据抢占造成程序错误。Python提供了很多线程同步原语,如时间,锁等。“当这些选项存在时,最佳实践是转而关注于使用队列。相比较而言,队列更容易处理,并且可以使得线程编程更加安全,因为它们能够有效地传送单个线程对资源的所有
相关文档:
[原创]Python(pysvn)提取svn版本间改动文件列表
by AKara 2010.04.29 @ http://blog.csdn.net/akara @ akaras@163.com
---------------------------------------------------------------------
希望实现一个提取两个svn revision间有变动(增/删/改)的文件的列表
的命令行工具;可以帮我们项目做一些流 ......
关键字: python
Python、Unicode和中文[转]
python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识。当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,不用我们这么麻烦了。
先来看看python的版本:
>>> import sys
>> ......
>>> from socket import socket, SOCK_DGRAM, AF_INET
>>> s = socket(AF_INET, SOCK_DGRAM)
>>> s.connect(('google.com', 0))
>>> s.getsockname()
('192.168.1.113', 43711)
Linux:
import socket
import fcntl
import struct
def get_ip_address(ifname):
s = ......
基本上都是使用python来解析xml文件的。
比如我要将内容为
<?xml version="1.0" encoding="utf-8"?>
<root>
<book isbn="34909023">
<author>
&n ......
>>> import time
>>> import datetime
>>>
now = time.localtime()
>>> now
(2006, 4, 30, 18, 7, 35,
6, 120, 0)
>>> type(now)
<type 'time.struct_time'>
>>>
str_now = time.strftime("%m/%d/%Y %X", now )
>>>
str_n ......