python3练习题:并发编程(21-25)

关于python3中的并发编程,经过这些天的学习,归纳如下:

#practice21:多线程
  1. 线程的定义

  • 方法一:直接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
         
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值