使用多线程
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'
7.1【多线程与多进程】多线程使用
最新推荐文章于 2024-10-02 10:53:34 发布
该代码示例展示了如何使用Python的`threading`库创建线程来并行下载股票CSV数据,并将其转换为XML文件。由于Python的GIL限制,多线程更适合于IO密集型任务而非CPU密集型任务,因此这种方法适用于提高数据下载的速度。代码通过创建自定义线程类`MyThread`来封装数据和处理逻辑。
摘要由CSDN通过智能技术生成