-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path6-0.如何使用多线程.py
122 lines (100 loc) · 3.08 KB
/
6-0.如何使用多线程.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
'''
问题:如何使用多线程?
实际案例
http://tabl.finance.yahoo.com/table.csv?s-000001.sz
我们通过雅虎网站获取了中国股市某支股票csv数据文件,
现在要下载多只股票的csv数据,并将其转换为xml文件.
如何使用线程来提高下载并处理的效率?
解决方案
使用标准库threading.Thread创建线程,在每-个线程中下载并转换一只股票数据。
'''
from threading import Thread
import csv
from xml.etree.ElementTree import Element, ElementTree
import requests
from io import StringIO
def pretty(e, level=0):
if len(e) > 0:
e.text = '\n' + '\t' * (level + 1)
for child in e:
pretty(child, level + 1)
child.tail = child.tail[:-1]
e.tail = '\n' + '\t' * level
# IO操作 访问网络,或者磁盘
def download(url):
response = requests.get(url, timeout=3)
if response.ok:
return StringIO(response.content)
# CPU 密集型操作
# 然鹅 在python 不适合处理 CPU密集型操作
# 因为 pyhton 有 GIL, 全局解释器锁, 导致当前只能有一个 线程能够被执行
# 所以就不是真正意义上的 多线程
def csvToXml(scsv, fxml):
reader = csv.reader(scsv)
headers = next(reader)
headers = map(lambda h: h.replace(' ', ''), headers)
root = Element('Data')
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)
# 普通 for
# if __name__ == '__main__':
# '''
# url = 'http://table.finance.yahoo.com/table.csv?s=00001.sz'
# rf = download(url)
# print(rf)
# if rf:
# with open('00001.xml', 'wt') as wf:
# csvToXml(rf, wf)
# '''
# for sid in range(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, 'wt') 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, 'wt') as wf:
csvToXml(rf, wf)
# 线程方法一:
'''
t = Thread(target=handle, args=(1,))
t.start()
print('main thread')
'''
# 线程方法二:
class MyThread(Thread):
def __init__(self, sid):
Thread.__init__(self)
self.sid = sid
def run(self):
handle(self.sid)
threads = []
for i in range(1, 11):
t = MyThread(i)
threads.append(t)
t.start()
for t in threads:
# 主占函数, 当前面执行完之后再执行
t.join()
print('main thread')