Python 3 之多线程研究

来源:互联网 发布:直通车怎么开淘宝 编辑:程序博客网 时间:2024/05/18 01:26

今天想写一个工具,通过多线程去一个队列中读取数据,要求如下:

1.多个线程同时读取队列,所以队列要做到线程安全:queue.Queue,这个本身就是线程安生的,所以没有问题

2.主线程要等到所有新开的子线程结束后才能结束,这个用到了Threading中的isAlive()方法,来判断线程是否还存活

3.不能出现开了多个子线程,却被一个抢着CPU执行时间,这个学过操作系统的都知道time.sleep(0.01),线程停止一下,让出CPU下面是代码了

我的博客:http://www.paulwangblog.com/

'''Created on 2011-11-10@author: PaulWangDescription:FileName:myThread.py'''import threadingimport timeclass MyThread(threading.Thread):    def __init__(self, threadname,records):        threading.Thread.__init__(self, name=threadname)        self.records = records        self.name = threadname    def run(self):#        time.sleep(0.01)        print("downloadFromQueue start %d" % self.records.qsize())        while(self.records.qsize()):            print( "id:%s get item is %s" % (self.name, self.records.get()) )            time.sleep(0.001)

'''Created on 2011-11-9@author: PaulWangDescription:FileName:test.py'''from queue import Queueimport myMySQLimport threadingimport timefrom myThread import MyThreadtry:    def download(records,threadNum):        tasks = []        for i in range(0,threadNum):            Thread = MyThread(i,records)            Thread.setDaemon( False )#主线程结束后子线程结束整个进程才结束            Thread.start()            tasks.append(Thread)        #如果有线程没有结束,那就不退出,确保主线程不退出        for task in tasks:            if task.isAlive():                tasks.append(task)                continue    db = myMySQL.myMySQL();    db.connect( "localhost","root","","cdcol",True )    db.selectDB("drupal")    rows = db.getrows("select * from test")    print(rows)    myQueue = Queue()    for row in rows:        myQueue.put(row)    download(myQueue,4)       if db.isConnected():        db.close()    print('is over...')except:    if db.isConnected():        db.close()        print("error ")




原创粉丝点击