Python多线程学习教程
发布日期:2021-07-01 04:21:16 浏览次数:2 分类:技术文章

本文共 2506 字,大约阅读时间需要 8 分钟。

首先我们来解释一下多线程:多线程我们可以理解为多个进程/多个程序同时运行,多线程最大的好处就是帮助我们提高效率,平常我们1小时完成的任务,通过多线程10分钟就可以完成,甚至更短,这个就取决于你的线程数啦。

多线程会给我们带来什么:好处:它可以大大提高我们代码处理数据的速度;缺点:代码的复杂度也将随之提高,死锁问题也将随之产生。

我们该如果入手多线程:先尝试着成功运行一份多线程代码。然后再解读这份代码,依据自己现有的知识去理解这份代码,遇到不懂的地方记下来,然后带着这些疑问去看小编的教程你会发现事半功倍的。学完后记得自己写几个多线程加以训练。

这是小编为大家准备的一份多线程示范代码:

#!/usr/bin/python3import queueimport threadingimport timeexitFlag = 0class myThread (threading.Thread):    def __init__(self, threadID, name, q):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.q = q    def run(self):        print ("开启线程:" + self.name)        process_data(self.name, self.q)        print ("退出线程:" + self.name)def process_data(threadName, q):    while not exitFlag:        queueLock.acquire()        if not workQueue.empty():            data = q.get()            queueLock.release()            print ("%s processing %s" % (threadName, data))        else:            queueLock.release()        time.sleep(1)threadList = ["Thread-1", "Thread-2", "Thread-3"]nameList = ["One", "Two", "Three", "Four", "Five"]queueLock = threading.Lock()workQueue = queue.Queue(10)threads = []threadID = 1# 创建新线程for tName in threadList:    thread = myThread(threadID, tName, workQueue)    thread.start()    threads.append(thread)    threadID += 1# 填充队列queueLock.acquire()for word in nameList:    workQueue.put(word)queueLock.release()# 等待队列清空while not workQueue.empty():    pass# 通知线程是时候退出exitFlag = 1# 等待所有线程完成for t in threads:    t.join()print ("退出主线程")

运行结果:

开启线程: Thread-1开启线程: Thread-2Thread-1: Wed Apr  6 11:52:57 2017Thread-1: Wed Apr  6 11:52:58 2017Thread-1: Wed Apr  6 11:52:59 2017Thread-2: Wed Apr  6 11:53:01 2017Thread-2: Wed Apr  6 11:53:03 2017Thread-2: Wed Apr  6 11:53:05 2017退出主线程

 

一、使用Threading模板块创建线程:

1,函数方法介绍:

  • run():用以表示线程活动的方法
  • start():启动线程活动
  • join([time]):等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
  • isAlive():检查一个线程是否仍旧在进行
  • getName():返回一个线程的名字
  • setName():设置一个线程的名字

2,要使用theading模板实现一个新线程,你要做的有:

定义Thread类的一个子类

    重写__init__(self [,args])方法

    然后,重写run(self [,args])方法

    在你创建新的Thread子类以后,你可以创建它的一个实例,然后引用start()来开启一个新线程。

 

二、同步线程

如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。

引入“锁”的概念,锁的两种状态——锁定和未锁定

锁定:锁定部分代码不能被其他程序运行

未锁定:多个线程可以同时运行这部分

threadLock = threading.Lock()#获取锁,对下面代码进行锁定,保持线程同步threadLock.acquire()#释放锁,解除上方代码的锁定,让其他进程进入threadLock.release()

 

三、多线程优先级队列:

Queue模块允许你创建一个新的队列对象,以盛放一定数量的项目

控制Queue有以下方法:

  • get():从队列移除一个项目并返回它
  • put():把项目放入队列
  • qsize():返回当前队列中项目的数量
  • empty():如果队列为空,返回True,反之为False
  • full():如果队列满了返回True,反之为False

 

转载地址:https://mtyjkh.blog.csdn.net/article/details/80271646 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:pandas教程(一)Series与DataFrame
下一篇:我的微信公众号

发表评论

最新留言

很好
[***.229.124.182]2024年04月27日 13时26分19秒