python高级编程语法--多任务:线程(一)

多任务:就是指多个任务一起执行。

解释多任务之前,先了解几个概念。 当你的电脑是单核cpu时,如果需要执行多个程序,那么会给每个程序轮流分配时间段进行执行,比如每个程序分配0.0001秒的时间,这样的轮流执行的方式被称为时间片轮转。 并行:真的多任务,当cpu核数大于需要执行的任务时; 并发:假的多任务,当cpu核数小于需要执行的任务时,这里会采用时间片轮转的方式。也是我们电脑大多数执行任务时的方式。

hreading模块:python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用。threading模块里面有一个类Tread。

一个程序运行起来之后,一定有一个要执行的东西,这个东西 咱们就称之为 线程

如:

t = threading.Thread(target=saySorry)   # 创建一个实例对象,这个对象就是要启动的线程
t.start()   # 启动线程,即让线程开始启动

通俗的说,要创建多线程,即是想方设法的多创建这样的实力对象,并且调用start()函数。

单线程执行:

import time

def saySorry():
     print("亲爱的,我错了,我能吃饭了吗?")
     time.sleep(1)

if __name__ = "__main__":
    for i in range(5):
        saySorry()

多线程执行:

improt threading
import time

def saySorry():
    print("亲爱的,我错了,我能吃饭了吗?")
    time.sleep(1)

if __name__ = "__main__":
    for i in range(5):
    t = threading.Thread(target=saySorry)  # 通过threading.Thread(target=函数名)创建线程
    t.start()  # 启动线程,即让线程开始执行

查看当前正在运行的线程数:enumerate()

enumerate()函数返回的是一个元组,可以用来查看当前正在执行的线程数

import threading
import time

def test1():
     for i in range(5):
         print("----------test1----%d------" % i)
         time.sleep(1)   # 延时1s

# 如果创建Thread时执行的函数,运行结束那么意味着这个子线程结束了....


def test2():
      for i in range(10):
          print("-----------test2---%d-----" % i)
          time.sleep(1)

def main():
    t1 = threading.Thread(target=test1)   # 创建线程
    t2 = threading.Thread(target=test2)

def test2():
for i in range(10):
    print("-----------test2---%d-----" % i)
    time.sleep(1)

def main():
    t1 = threading.Thread(target=test1)   # 创建线程
    t2 = threading.Thread(target=test2)

     t1.start()   # 启动线程
     t2.start()
     while True:

         print(threading.enumerate())  # 打印正在执行的线程数量
         if len(threading.enumerate())<=1:   # 判断线程数量是否小于等于1,等于1时说明只剩主线程
             break
         time.sleep(1)
if __name__ == "__main__":
    main()

多线程之间共享全局变量,所以存在资源竞争问题
解决资源竞争问题:

互斥锁:

#创建一个互斥锁,默认是没有上锁的
mutex = threading.Lock()

#上锁,如果之前没有上锁的,那么此时,上锁成功
#如果上锁之前 已经被上锁了,那么此时会堵塞在这里,直到这个锁被解开为止
mutex.acquire()

#需要被锁定的程序

#解锁
mutex.release()

死锁:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
如果要解决死锁问题,可以设置超时时间。

你可能感兴趣的:(python,多线程,thread,多进程)