关于python3中的并发编程,经过这些天的学习,归纳如下:
#practice21:多线程
- 线程的定义
- 方法一:直接Thread()构造
- 方法二:构造Thread的子类
#多线程的使用
from urllib.request import urlretrieve
import csv
from xml.etree.ElementTree import ElementTree,Element
from threading import Thread
def download(sid,filename):
'''下载csv文件'''
url = 'http://quotes.money.163.com/service/chddata.html?code=%s&start=20150104&end=20160108' % str(sid)
response = urlretrieve(url,filename)
def convert(filename):
'''csv文件转换为xml文件'''
with open(filename,'rt',encoding='GB2312')as rf:
if rf:
reader = csv.reader(rf)
header = next(reader)
root = Element('data')
for row in reader:
line = Element('row')
root.append(line)
for key,value in zip(header,row):
e = Element(key)
e.text = value
line.append(e)
et = ElementTree(root)
et.write('%s.xml' % filename,encoding='utf-8')
def handle(sid):
print("downloading %s :" % str(sid))
download(sid,'demo%s.csv' % str(sid))
print("converting %s :" % str(sid))
convert('demo%s.csv' % str(sid))
#方法一
threads = []
for i in range(1000001,1000010):
#注意,args不能是(i),因为必须是元组
t = Thread(target=handle,args=(i,))
threads.append(t)
t.start()
#线程等待
for t in threads:
t.join()
print("main thread")
#方法二
class Mythread(Thread):
def __init__(self,sid):
Thread.__init__(self)
self.sid = sid
def run(self):
handle(self.sid)
print('*'*20)
threads = []
for i in range(1000001,1000010):
t = Mythread(i)
threads.append(t)
t.start()
#线程等待
for t in threads:
t.join()
print("main thread")
执行结果:
downloading 1000001 :
downloading 1000002 :
downloading 1000003 :
downloading 1000004 :
downloading 1000005 :
downloading 1000006 :
downloading 1000007 :
downloading 1000008 :
downloading 1000009 :
converting 1000003 :
converting 1000006 :
converting 1000004 :
converting 1000009 :
converting 1000001 :
converting 1000005 :
converting 1000008 :
converting 1000002 :
converting 1000007 :
main thread
********************
downloading 1000001 :
downloading 1000002 :
downloading 1000003 :
downloading 1000004 :
downloading 1000005 :
downloading 1000006 :
downloading 1000007 :
downloading 1000008 :
downloading 1000009 :
converting 1000003 :
converting 1000002 :
converting 1000005 :
converting 1000004 :
converting 1000001 :
converting 1000009 :
converting 1000008 :
converting 1000006 :
converting 1000007 :
main thread
[Finished in 0.9s]
#practice22:线程间通信
- .Queue,该队列是线程安全的;
- 一个进程内的多个线程共用地址空间,这是线程间通信的基本依据;
- 本例采用生产者/消费者模型,有多个生产者和一个消费者,每个生产者占用一个线程
- 消费者只有一个,故必须使用循环来处理生产者生产的数据
from urllib.request import urlretrieve
import csv
from xml.etree.ElementTree import ElementTree,Element
from threading import Thread
from queue import Queue
class DownloadThread(Thread):
'''下载线程'''
def __init__(self,sid,queue):
Thread.__init__(self)
self.sid = sid
self.filename = 'demo{}'.format(str(sid))
self.queue = queue
def download(self,sid,filename):
'''下载csv文件'''
url = 'http://quotes.money.163.com/service/chddata.html?code=%s&start=20150104&end=20160108' % str(sid)
response = urlretrieve(url,filename)
def run(self):
print("downloading %s :" % str(self.sid))
self.download(self.sid,self.filename)
self.queue.put(self.filename)
class ConvertThread(Thread):
'''转换现场'''
def __init__(self,queue):
Thread.__init__(self)
self.queue = queue
def convert(self,filename):
'''csv文件转换为xml文件'''
with open(filename,'rt',encoding='GB2312')as rf:
if rf:
reader = csv.reader(rf)
header = next(reader)
root = Element('data')
for row in reader:
line = Element('row')
root.append(line)
for key,value in zip(header,row):
e = Element(key)
e.text = value