python 多线程

tsgxj 2018-07-01 原文

python 多线程

(一)基础概念线程:是程序执行流的最小单元(线程内部可开线程)、每一个程序都至少有一个线程、线程共享统一进程中的所有资源。

进程:是最小的资源单元(内存资源的分配与调度)线程共享进程中的资源,(每个进程中至少有一个线程(QQ\360))

并发:是指系统具有执行多个任务(动作)的能力并行:是指系统具同一时刻进行多个任务(动作)的能力(是并发子集)

线程与进程关系:一个程序至少有一个进程、每个进程中至少有 一个线程

(1)线程的创建(threading接口)

(1)线程的创建(threading接口)
1.自己创建线程
# sampleOne
import threading
import time
def Hi(name):
    print("Hello %s" %name)
    time.sleep(3)
if __name__=="__main__":
    t1 = threading.Thread(target=Hi,args=("萌萌",))
    t1.start()
    t2 = threading.Thread(target=Hi, args=("蒙蒙",))
    t2.start()
    print("end")

  

2)线程的调用方式

2.创建线程类继承threading.Thread类下的方法
class Mythread(threading.Thread):
    def __init__(self, num):
        # threading.Thread.__init__(self)
        super().__init__()
        self.num = num
    def run(self):
        # music1()
        # game1()
        print("start num %d" % self.num)
if __name__ == "__main__":
    t1 = Mythread(1)
    t2 = Mythread(2)
    t1.start()
    t2.start()

(3)线程阻塞join方法

join:子线程完成之前主线程一直阻塞'''
def music():
    print("begin to listen %s" %time.ctime())
    time.sleep(3)
    print("stop to listen %s" % time.ctime())
def game():
    print("begin to game %s" % time.ctime())
    time.sleep(5)
    print("stop to game %s" % time.ctime())
if __name__ == "__main__":
    t1 = threading.Thread(target=music, )
    t2 = threading.Thread(target=game, )
    t1.start()
    t2.start()
    # t1.join()
    t2.join()
  print("over end ")

  

(4)线程的守护 setDaemon

'''setDaemon:线程守护、子线程跟随主线程一起退'''
def music1():
    print("begin to listen %s" %time.ctime())
    time.sleep(3)
    print("stop to listen %s" % time.ctime())
def game1():
    print("begin to game %s" % time.ctime())
    time.sleep(5)
    print("stop to game %s" % time.ctime())
if __name__ == "__main__":
    t1 = threading.Thread(target=music1, )
    t2 = threading.Thread(target=game1, )
    t2.setDaemon(True)
    t1.start()
    t2.start()

 (5)线程锁与递归锁、结果不是想要的、多个线程操作同一个对象是引发数据安全、只能借助线程锁threading.Lock()

# 开100个线程、每个线程对同一个数递减1
import time
import threading
def sub():
    global num
    temp = num
    time.sleep(0.01)
    num = temp-1
if __name__=="__main__":
    num=100
    for i in range(100):
        t = threading.Thread(target=sub)
        t.start()
    t.join()

  ”’针对线程安全问题创建线程同步锁’、”输出结果为0、是想要的结果、但有些情况锁也会带来负面的影响

def sub1():
    global num
    lock.acquire()
    temp = num
    time.sleep(0.001)
    num = temp-1
    lock.release()
if __name__ =="__main__":
    num=100
    lock=threading.Lock()
    for i in range(100):
        t = threading.Thread(target=sub1)
        t.start()
    t.join()
    print(num)

  死锁

class Mythread(threading.Thread):
    def actionA(self):
        A.acquire()
        print(self.name, "got A", time.ctime())
        B.acquire()  
        print(self.name, "got B", time.ctime())
        B.release()  
        A.release() 
    def actionB(self):
        B.acquire()
        print(self.name, "got B", time.ctime())
        A.acquire()
        print(self.name, "got A", time.ctime())
        A.release()
        B.release()
    def run(self):
        self.actionA()
        self.actionB()
if __name__ == "__main__":
    L = []
    A=threading.RLock()
    B=threading.RLock()
    for i in range(5):
        t = Mythread()
        t.start()
        L.append(t)
    for t in L:
        t.join()
    print("ending>>>>>>>>>>")

 (5)递归锁RLock()解决死锁问题  

创建一把递归锁、替换上面的所有锁 r_lock=threading.RLock()

class Mythread(threading.Thread):
    '''递归锁 解决死锁'''
    def actionA(self):
        r_lock.acquire()  # count=1
        print(self.name, "got A", time.ctime())
        r_lock.acquire()  # 锁中锁 count=2
        print(self.name, "got B", time.ctime())
        r_lock.release()  # count = 1
        r_lock.release()  # count = 0
    def actionB(self):
        r_lock.acquire()
        print(self.name, "got B", time.ctime())
        r_lock.acquire()# 锁中锁
        print(self.name, "got A", time.ctime())
        r_lock.release()
        r_lock.release()
    def run(self):
        self.actionA()
        self.actionB()
if __name__ == "__main__":
    L = []
    r_lock=threading.RLock()
    for i in range(5):
        t = Mythread()
        t.start()
        L.append(t)
    for t in L:
        t.join()
    print("ending>>>>>>>>>>")

  

需求:多个线程删除列表中的最后一个元素并删除

 L=[1,3,45,65,76,32,3254]
 def pri():
     while 1:
         a = L[-1]
         print(a)
         time.sleep(2)
         L.remove(a) # 按值来删除
         # L.pop(-1) # 按照索引删除
t1=threading.Thread(target=pri,args=())
t1.start()
t2=threading.Thread(target=pri,args=())
t2.start()

看运行结果、

 

(6)队列queue、是一种数据结构线程使用队列、数据是安全的

import queue
Li=[]
q=queue.Queue() # FIFO
# # q =queue.LifoQueue()# LIFO
# q =queue.PriorityQueue(4) # 优先级s
q.put([4,234])
q.put_nowait([2,"hello"])
q.put([3,{"name","alex"}])
q.put([5,{"gendle":"女"}],)
# q.put(78,block=False) # 队列已满时报错
# q.put_nowait(78) # 队列已满时报错
while 1:
    # data=q.get()
    data = q.get(block=False)
    # data =q.get_nowait()  # 为空时报错
    print(data)
    # print(q.qsize())
    # print(q.empty())
    # print(q.full())
    # print(data[1])
    time.sleep(1)
    print("----------")

(7)同步对象Event、保证所有的线程中状态完全一致’

import threading
import time
'''同步对象Event 保证所有的线程中状态完全一致'''
class teacher(threading.Thread):
    def run(self):
        print("teacher: 明天把之前的作业留的作业都完成交上来")
        print("状态是否被设定",event.isSet())
        event.set()
        time.sleep(5)
        print("teacher:既然这样那下周一交上来")
        event.set()
class student(threading.Thread):
    def run(self):
        event.wait() # 一旦event.set() 则event.wait()==pass
        print("student:啊那么多怎么可能一天完成啊!!!!!")
        time.sleep(2)
        event.clear()
        event.wait()
        print("student:ohyear!!")
if __name__ == "__main__":
    event = threading.Event()
    threads=[]
    for i in range(6):
        threads.append(student())
    threads.append(teacher())
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print("所有的都结束了")

  

发表于 2018-07-01 22:12 起个名字真难1 阅读() 评论() 编辑 收藏

 

版权声明:本文为tsgxj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tsgxj/p/9251576.html

python 多线程的更多相关文章

  1. Python 学习 第十七篇:数据类型(元组和集合)

    元组和集合是Python中的基本类型 一,元组 元组(tuple)由小括号、逗号和数据对象构成的集合,各个项通 […]...

  2. Spark从入门到放弃—RDD

    什么是Spark? 关于Spark具体的定义,大家可以去阅读官网或者百度关于Spark的词条,在此不再赘述。从 […]...

  3. 线程、多线程和线程池,看完这些你就能全部搞懂了

    摘要:一文带你搞懂线程、多线程和线程池。 一.线程 在操作系统中,线程是比进程更小的能够独立运行的基本单位。同 […]...

  4. Python基础知识之疑点难点

    一、标识符 (1) 标识符不能以数字开头;以下划线开头的标识符具有特殊的意义,使用时需要特别注意。   以单下 […]...

  5. Python 检测目标日期是否为当天?

    def is_today(target_date): """ 2020-03-25 17:03:55 Dete […]...

  6. python-networkx学习(1)

    介绍: networkx是python的一个库,它为图的数据结构提供算法、生成器以及画图工具。近日在使用ryu […]...

  7. scrapy-redis源码解读之发送POST请求

    1 引言 这段时间在研究美团爬虫,用的是scrapy-redis分布式爬虫框架,奈何scrapy-redis与 […]...

  8. python基础篇 08 文件操作

    python基础篇 08 文件操作 本节主要内容:1. 初识⽂件操作2. 只读(r, rb)3. 只写(w, […]...

随机推荐

  1. 性能调优必备:NIO的优化实现原理

    前言 我们就从底层的网络 I/O 模型优化出发,再到内存拷贝优化和线程模型优化,深入分析下 Tomcat、Ne […]...

  2. 反病毒工具-火绒剑 博客

    http://blog.csdn.net/dalerkd/ http://www.huorong.cn/...

  3. 引起PPT不能插入Excel对象的原因已经找到 – springsnow

    引起PPT不能插入Excel对象的原因已经找到 提示错误: 弹框内容为“无法找到服务器应用程序、源文件、和项目 […]...

  4. HTML特殊转义字符——特殊符号

    干货,见下图:     后期我会陆续更一些JavaScript的文章,大家可以一起学习交流。  ...

  5. linux-mysql8的安装步骤详解及需要注意的坑

    (本文由言念小文原创,转载请注明出处) 前言 最近安装mysql8时,遇到了一些问题,记录下来作为以后操作指导 […]...

  6. Linux运维(一)——服务器硬件知识

    一、运维人员的工作职责:   1.保证数据不能丢失   2.保证服务器24小时运行   3.让用户体验更好 二 […]...

  7. 渲染公式推导

    渲染公式的推导:  L (x->x1) = 积分 ( L (x2->x) * BRDF(x2-&g […]...

  8. access数据库教程

    http://jingyan.baidu.com/article/adc815133438bdf722bf73 […]...

展开目录

目录导航