python 8-3イベント通知をオンラインで行う方法
10457 ワード
python 8-3-1 tarfileを使用してファイルの圧縮パッケージを実現
解決策:スレッド間のイベント通知、標準ライブラリのThreadingを使用できる.Eventは、2つのスレッドの場合、一般的に2つのeVentを用いて相互に通知する.待機イベントの一端はwaitを呼び出し、イベントeventを待機する.wait()は、waitを持続的に有効にするevent.clear() 2.通知イベントの一端はsetを呼び出し、イベントeventを通知する.set() 3.daemonスレッドとは、すべてのスレッドが終了すると、daemonスレッドもtarfileを使用してファイルの圧縮パッケージを実現することを終了することを意味します.
解決策:スレッド間のイベント通知、標準ライブラリのThreadingを使用できる.Eventは、2つのスレッドの場合、一般的に2つのeVentを用いて相互に通知する.待機イベントの一端はwaitを呼び出し、イベントeventを待機する.wait()は、waitを持続的に有効にするevent.clear() 2.通知イベントの一端はsetを呼び出し、イベントeventを通知する.set() 3.daemonスレッドとは、すべてのスレッドが終了すると、daemonスレッドもtarfileを使用してファイルの圧縮パッケージを実現することを終了することを意味します.
from xml.etree.ElementTree import Element,ElementTree
from xml.dom.minidom import parse
from xml.dom import minidom
from threading import Thread
from threading import Event
from collections import deque
from Queue import Queue
from StringIO import StringIO
import requests
import csv
q2 =deque()
def pretty(e,level=0):
if len(e) >0:
e.text='
' + '\t'*(level+1)
for child in e:
pretty(child,level+1)
child.tail=child.tail[:-1]
e.tail='
' + '\t'*level
class DownloadThread(Thread):
def __init__(self,sid,queue):
Thread.__init__(self)
self.sid = sid
self.url = "http://table.finance.yahoo.com/table.csv?s=%s.sz"
self.url %= str(sid).rjust(6,'0')
self.queue = queue
def download(self,url):
proxies = {"http": "http://135.245.48.34:8000"}
#response = requests.get(url,proxies=proxies)
#response = requests.get(url)
#if response.ok:
# return StringIO(response.content)
f = open("pingan.csv")
#reader = csv.reader(f)
#return StringIO(reader)
return StringIO(f.read())
def run(self):
print "download ",self.sid,self.url
data = self.download(self.url)
self.queue.put((self.sid,data))
class ConvertThread(Thread):
def __init__(self,queue,cEvent,tEvent):
Thread.__init__(self)
self.queue = queue
self.cEvent = cEvent
self.tEvent = tEvent
def createXmlFromCsv(self,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)
def csvToXml(self,scsv,fname):
reader=csv.reader(scsv)
headers=reader.next()
root=Element('Data')
for row in reader:
eRow=Element('Row')
root.append(eRow)
for tag,text in zip(headers,row):
e=Element(str(tag).replace(" ", "_"))
e.text=text
eRow.append(e)
pretty(root)
et = ElementTree(root)
et.write(fname)
def run(self):
count = 0
while True:
sid, data = self.queue.get()
if sid == -1:
print "-1 was called"
self.cEvent.set()
self.tEvent.wait()
break
if data:
print 'Convert to XML ...(%d)' % sid
fname = str(sid).rjust(6,'0') + '.xml'
with open (fname,'wb') as wf:
self.createXmlFromCsv(data,wf)
#self.csvToXml(data,wf)
count += 1
if count == 5:
self.cEvent.set()
self.tEvent.wait()
self.tEvent.clear()
count = 0
class TarThread(Thread):
def __init__(self,cEvent,tEvent):
Thread.__init__(self)
self.count = 0
self.cEvent = cEvent
self.tEvent = tEvent
self.setDaemon(True)
def tarXml(self):
self.count += 1
tfname = '%d.tgz' %self.count
tf = tarfile.open(tfname,"w:gz")
for fname in os.listdir('.'):
if fname.endswith('.xml'):
tf.add(fname)
os.remove(fname)
tf.close()
if not tf.members:
os.remove(tfname)
def run(self):
while True:
self.cEvent.wait()
self.tarXml()
self.cEvent.clear()
self.tEvent.set()
q=Queue()
cEvent = Event()
tEvent = Event()
dThreads=[DownloadThread(i,q) for i in xrange(1,13)]
cThreads=ConvertThread(q,cEvent,tEvent)
tThread = TarThread(cEvent,tEvent)
for t in dThreads:
t.start()
cThreads.start()
tThread.start()
for t in dThreads:
t.join()
q.put((-1,None))