python 8-1 如何使用多线程
使用标准库中的threading.Thread创建线程, 在每一个线程中下载并转换一只股票数据
首先python受限于GIL的缘故,多线程只适合IO包括网络IO,磁盘IO,密集型的任务,不适合计算密集型的任务
实现多线程一般有两种方式
第一种:直接将需要执行逻辑部分的函数赋值给target
t = Thread(target=handle,args=(1,))
t.start()
第二种:定义一个自己的类继承Thread,然后将逻辑函数放在run方法中执行
class MyThread(Thread):
def init(self,sid):
self(MyThread,self).init()
self.sid = sid
def run(self):
handle(self.sid)
t=MyThread(1)
t.start()
from threading import Thread
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 not None: continue
print ‘Convert to XML …(%d)’ % sid
fname = str(sid).rjust(6,’0’) + ‘.xml’
with open (fname,’wb’) as wf:
createXmlFromCsv(rf,wf)
t = Thread(target=handle,args=(1,))
t.start()
class MyThread(Thread):
def init(self,sid):
self(MyThread,self).init()
self.sid = sid
def run(self):
handle(self.sid)
t=MyThread(1)
t.start()
import csv
from xml.etree.ElementTree import Element,ElementTree
import requests
from StringIO import StringIO
from xml.dom.minidom import parse
from xml.dom import minidom
from test.test_heapq import SideEffectLT
from pip._vendor.requests.utils import get_environ_proxies
def download(url):
proxies = {"http": "http://xx.yy.zz.ww:8000"}
response = requests.get(url,proxies=proxies)
if response.ok:
return StringIO(response.content)
def createXmlFromCsv(scsv,fxml):
root=minidom.Document()
dataElement=root.createElement("Data")
reader=csv.reader(scsv)
headers=reader.next()
headers = map(lambda h: h.replace(' ',''),headers)
for row in reader:
rowElement=root.createElement("Row")
for tag,text in zip(headers,row):
item=root.createElement(tag)
item.appendChild(root.createTextNode(text))
rowElement.appendChild(item)
dataElement.appendChild(rowElement)
fxml.write(root.appendChild(dataElement).toprettyxml())
#return root.appendChild(dataElement)
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:
createXmlFromCsv(rf,wf)
from threading import Thread
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:
createXmlFromCsv(rf,wf)
import time
def handle2(sid):
print "Counting... %d"%sid
for i in [x for x in range(sid)]:
time.sleep(0.01)
print "Counting done %d"%sid
t = Thread(target=handle2,args=(1,))
t.start()
class MyThread(Thread):
def __init__(self,sid):
super(MyThread,self).__init__()
self.sid = sid
def run(self):
handle2(self.sid)
t=MyThread(2)
t.start()
threads = []
for i in xrange(1,11):
t = MyThread(i)
threads.append(t)
t.start()
for t in threads:
t.join()
print "main thread..."