• 多线程【thread】【queue储存、锁】【2】


    学习:

    Python中的多线程(史上最简单易懂版)_时代&信念的博客-CSDN博客_python多线程

    一、使用Queue存储线程的结果

    线程的执行结果,无法通过return进行返回,使用Queue存储。

    # coding:utf-8
    import threading
    from queue import Queue
    """
        Queue的使用
    """

    def job(l, q):
        for i in range(len(l)):
            l[i] = l[i] ** 2
        q.put(l)


    def multithreading():
        # 创建队列
        q = Queue()
        # 线程列表
        threads = []
        # 二维列表
        data = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [6, 6, 6]]
        for i in range(4):
            t = threading.Thread(target=job, args=(data[i], q))
            t.start()
            threads.append(t)

        # 对所有线程进行阻塞
        for thread in threads:
            thread.join()
        results = []
        # 将新队列中的每个元素挨个放到结果列表中
        for _ in range(4):
            results.append(q.get())
        print(results)


    if __name__ == "__main__":
        multithreading()

    二、线程锁lock

    当同时启动多个线程时,各个线程之间会互相抢占计算资源,会造成程序混乱。

    锁只有“锁定”和“非锁定”两种状态,当锁被创建时,是处于“非锁定”状态的。当锁已经被锁定时,再次调用acquire()方法会被阻塞执行,直到锁被调用release()方法释放掉锁并将其状态改为“非锁定”。

    同一个线程获取锁后,如果在释放锁之前再次获取锁会导致当前线程阻塞,除非有另外的线程来释放锁,如果只有一个线程,并且发生了这种情况,会导致这个线程一直阻塞下去,即形成了死锁。所以在获取锁时需要保证锁已经被释放掉了,或者使用递归锁来解决这种情况。

    • acquire(blocking=True, timeout=-1):获取锁,并将锁的状态改为“锁定”,成功返回True,失败返回False。当一个线程获得锁时,会阻塞其他尝试获取锁的线程,直到这个锁被释放掉。timeout默认值为-1,即将无限阻塞等待直到获得锁,如果设为其他的值时(单位为秒的浮点数),将最多阻塞等待timeout指定的秒数。当blocking为False时,timeout参数被忽略,即没有获得锁也不进行阻塞。
    • release():释放一个锁,并将其状态改为“非锁定”,需要注意的是任何线程都可以释放锁,不只是获得锁的线程(因为锁不属于特定的线程)。release()方法只能在锁处于“锁定”状态时调用,如果在“非锁定”状态时调用则会报RuntimeError错误。



    先掌握理论!!!:) 实践之后再补充! 

    芜湖:】

     

  • 相关阅读:
    鄂州市高新技术企业申报奖励有哪些?除了资金还有别的好处吗?2022年申报材料以及申报流程有变化吗啊?
    Entity Developer数据库应用程序的开发
    FastDFS小文件存储原理
    ACM第三周总结
    全新自适应导航网模板 导航网系统源码 网址导航系统源码 网址目录网系统源码
    java 宠物在线商城系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目
    Css三角
    c++运算符
    学C++要不要先学C语言?
    python 深度学习 解决遇到的报错问题3
  • 原文地址:https://blog.csdn.net/weixin_63016274/article/details/127778775