前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python多线程学习教程

Python多线程学习教程

作者头像
K同学啊
发布2019-01-22 11:27:39
6340
发布2019-01-22 11:27:39
举报
文章被收录于专栏:明天依旧可好的专栏

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

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

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

需要Python3学习资源的小伙伴,可以关注左侧的微信公众号,有这些资源

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

代码语言:javascript
复制
#!/usr/bin/python3

import queue
import threading
import time

exitFlag = 0

class 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 ("退出主线程")

运行结果:

代码语言:javascript
复制
开启线程: Thread-1
开启线程: Thread-2
Thread-1: Wed Apr  6 11:52:57 2017
Thread-1: Wed Apr  6 11:52:58 2017
Thread-1: Wed Apr  6 11:52:59 2017
Thread-2: Wed Apr  6 11:53:01 2017
Thread-2: Wed Apr  6 11:53:03 2017
Thread-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()来开启一个新线程。

二、同步线程

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

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

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

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

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

三、多线程优先级队列:

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

控制Queue有以下方法:

  • get():从队列移除一个项目并返回它
  • put():把项目放入队列
  • qsize():返回当前队列中项目的数量
  • empty():如果队列为空,返回True,反之为False
  • full():如果队列满了返回True,反之为False
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年05月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档