本文共 1728 字,大约阅读时间需要 5 分钟。
今天想写一个工具,通过多线程去一个队列中读取数据,要求如下:
1.多个线程同时读取队列,所以队列要做到线程安全:queue.Queue,这个本身就是线程安生的,所以没有问题
2.主线程要等到所有新开的子线程结束后才能结束,这个用到了Threading中的isAlive()方法,来判断线程是否还存活
3.不能出现开了多个子线程,却被一个抢着CPU执行时间,这个学过操作系统的都知道time.sleep(0.01),线程停止一下,让出CPU下面是代码了
我的博客:
'''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 ")
转载地址:http://hggdi.baihongyu.com/