7.1【多线程与多进程】多线程使用

使用多线程
http://table.finance.yahoo.com/table.csv?s=000001.sz
下载多只股票的csv数据,并将其转换为xml文件,使用多线程来提高下载并处理
#
使用标准库threading.Thread创建线程,在每一个线程中下载并转换数据
import csv
from xml.etree.ElementTree import Element,ElementTree
import requests
from StringIO import StringIO
from xml_pretty import pretty

def download(url):
	response = requests.get(url, timeout=3) # IO操作
	if response.ok:
		return StirngIO(response.content) # StirngIO支持文件操作的内存对象
		
def csvToXml(scsv, fxml):
	reader = csv.reader(scsv) 
	headers = reader.next()
	headers = map(lambda h: h.replace(' ',''), headers)

	root = Element('Data') # cpu密集型操作,多处理器可以分别同时处理;python中的线程不适合处理cpu密集型操作:python中有GIL‘全局解释器锁’global interpreter lock,导致只有1个线程能被CPython解释器执行,无法实现真正意义上的并发;像在C语言中,使用CThread库,可将多个Thread调度到多个不同的处理器上;python中的线程只适合处理IO型的操作
	for row in reader:
		eRow = Element('Row')
		root.append(eRow)
		for tag, text in zip(headers, row):
			e = Element(tag)
			e.text = text
			eRow.append(e)
	pretty(root)
	et = ElementTree(root)
	et.write(fxml)

if __name__ == '__main__':
	url = 'http://table.finance.yahoo.com/table.csv?s=000001.sz'
	rf = download(url)
	if rf:
		with open('000001.xml', 'wb') as wf:
			csvToXml(rf, wf)
	'''	串行
	for sid in xrange(1,11):
		print 'Download...(%d)' % sid
		url = 'http://table.finance.yahoo.com/table.csv?s=%s.sz'
		url %= str(sid).rjust(6, '0')
		rf = download(url)
		if rf is None: continue

		print 'Convert to XML...(%d)' % sid
		fname = str(sid).rjust(6, '0') +'.xml'
		with open(fname, 'wb') as wf:
			csvToXml(rf, wf)
	'''
	'''
def handle(sid):
	print 'Download...(%d)' % sid
	url = 'http://table.finance.yahoo.com/table.csv?s=%s.sz'
	url %= str(sid).rjust(6, '0')
	rf = download(url)
	if rf is None: return

	print 'Convert to XML...(%d)' % sid
	fname = str(sid).rjust(6, '0') +'.xml'
	with open(fname, 'wb') as wf:
		csvToXml(rf, wf)

# linux 文本编辑处理行首缩进(32行到最后,每行首的4个空格替换成空白:  	:32,$s/^    //
from threading import Thread
t = Thread(target=handle,args=(1,)) # 第1只
t.start()
print 'main thread'

class MyThread(Thread):
	def __init__(self, sid): # 使用类可以更好的封装数据
		Thread.__init__(self) # 必须调用父类的构造器
		self.sid = sid # 作为类的属性
	def run(self): # 必须实现run方法,程序入口,和target类似
		handle(self.sid)
t = MyThread(1)
t.start()
t.join() # 主线程等待子线程结束后,再结束;执行t.join()之后,“主线程main”会进入“阻塞状态”等待t运行结束。“子线程t”结束之后,会唤醒“主线程main”,“主线程”重新获取cpu执行权,继续运行。
print 'main thread'		

threads = []
for i in xrange(1,11):
	t = MyThread(i)
	threads.append(t)
	t.start()
for t in threads:
	t.join()
print 'main thread'	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值