Python多线程学习教程

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

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

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

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

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

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

运行结果:

开启线程: 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类的一个子类

扫描二维码关注公众号,回复: 805175 查看本文章

    重写__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


猜你喜欢

转载自blog.csdn.net/qq_38251616/article/details/80271646
今日推荐