Python 3 之多线程研究

本文介绍了如何使用Python 3实现多线程,包括线程安全的队列操作(queue.Queue)、主线程等待子线程结束的策略(isAlive()方法),以及线程间的公平调度(time.sleep())。通过实例代码,展示了如何构建一个并发读取队列的多线程工具。

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

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

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

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

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

'''
Created on 2011-11-10

@author: PaulWang

Description:

FileName:myThread.py
'''
import threading
import time

class 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: PaulWang

Description:

FileName:test.py
'''

from queue import Queue
import myMySQL
import threading
import time
from myThread import MyThread

try:

    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 ")




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值