Python中线程与互斥锁

时间:2022-10-31 21:37:36

了解之前我们先了解一下什么是多任务?

概念: 几个不同的事件在同时运行就是多任务, 这样的话, 我们有牵扯到了真的多任务, 假的多任务;

并行: 真的多任务, 通过电脑的核数来确定

并发: 假的多任务, 即cpu的快速切换

线程

1.线程之间共享全局变量;

2.主线程等待子线程结束后才结束;

3.线程之间执行顺序是无序的;

4.互斥锁以及死锁的问题.

demo 如何创建线程:

import threading
from time import sleep,ctime def sing():
for i in range(3):
print("正在唱歌...%d"%i)
sleep(1) def dance():
for i in range(3):
print("正在跳舞...%d"%i)
sleep(1) if __name__ == '__main__':
print('---开始---:%s'%ctime()) t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance) t1.start() // 注意当调用start时才真正的开始执行程序
t2.start() #sleep(5) # 屏蔽此行代码,试试看,程序是否会立马结束?
print('---结束---:%s'%ctime())

多线程之间共享全局变量

demo:

from threading import Thread
import time def work1(nums):
nums.append(44)
print("----in work1---",nums) def work2(nums):
#延时一会,保证t1线程中的事情做完
time.sleep(1)
print("----in work2---",nums) g_nums = [11,22,33] t1 = Thread(target=work1, args=(g_nums,))
t1.start() t2 = Thread(target=work2, args=(g_nums,))
t2.start()

运行结果是:

----in work1--- [11, 22, 33, 44]

----in work2--- [11, 22, 33, 44]

互斥锁以及死锁的问题:
思考: 为什么要使用互斥锁?
线程之间共享资源, 这就导致了多个线程之间资源竞争, 导致了程序的运行.
思考: 锁的好处以及坏处?
好处: 保证了同一时间内允许一个线程的完整执行
坏处: 降低了效率, 可能会造成死锁问题

demo:

import threading
import time # 定义一个全局变量
g_num = 0
def test1(num):
global g_num for i in range(num): mutex.acquire() # 上锁 注意了此时锁的代码越少越好
g_num += 1
mutex.release() # 解锁 print("-----in test1 g_num=%d----" % g_num) def test2(num):
global g_num
for i in range(num):
mutex.acquire() # 上锁
g_num += 1
mutex.release() # 解锁
print("-----in test2 g_num=%d=----" % g_num) # 创建一个互斥锁,默认是没有上锁的
mutex = threading.Lock() def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,)) t1.start()
t2.start() # 等待上面的2个线程执行完毕....
time.sleep(2) print("-----in main Thread g_num = %d---" % g_num) if __name__ == "__main__":
main()

死锁: 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁

demo:

import threading
import time def test1(num):
print("---test1---")
mutex1.acquire()
print("test1 请求 mutex1")
time.sleep(1)
print("test1 获得 mutex1")
print("test1 请求 mutex2")
mutex2.acquire() def test2(num):
print("---test2---")
print("test2 请求 mutex2")
mutex2.acquire()
print("test2 获得 mutex2")
time.sleep(1)
print("test2 请求 mutex1")
mutex1.acquire() mutex1 = threading.Lock()
mutex2 = threading.Lock() def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,)) t1.start()
t2.start() if __name__ == "__main__":
main()

思考: 死锁如何避免?

1. 我们可以使用time.time()来进行一个超时等待;

2.银行家算法

有需要的话可以关注我的微信公众号,会第一时间接收最新的知识。

Python中线程与互斥锁

Python中线程与互斥锁的更多相关文章

  1. 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁

    并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...

  2. 谈谈有关 Python 的GIL 和 互斥锁

    转载:https://blog.csdn.net/Amberdreams/article/details/81274217 有 Python 开发经验的人也许听说过这样一句话:Python 不能充分利 ...

  3. python中线程和进程的简单了解

    python中线程和进程的简单了解   一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计 ...

  4. JoinableQueue队列,线程,线程于进程的关系,使用线程,线程的特点,守护线程,线程的互斥锁,死锁问题,递归锁,信号量

    1.JoinableQueue队列 JoinableQueue([maxsize]):这就像是一个Queue对象,但是队列允许项目的使用者通知生成者项目已经被成功处理.通知进程是使用共享的信号和条件变 ...

  5. python中线程和进程(一)

    目录 进程和线程 Python中的线程 1. Thread类 2. 线程的启动 3. 线程的传参 4. 线程的属性和方法 5. daemon线程和non-daemon线程 6. join方法 7. 定 ...

  6. python 并发编程 多进程 互斥锁 目录

    python 并发编程 多进程 互斥锁 模拟抢票 互斥锁与join区别

  7. Python 开启线程的2中方式,线程VS进程(守护线程、互斥锁)

    知识点一: 进程:资源单位 线程:才是CPU的执行单位 进程的运行: 开一个进程就意味着开一个内存空间,存数据用,产生的数据往里面丢 线程的运行: 代码的运行过程就相当于运行了一个线程 辅助理解:一座 ...

  8. day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,

    六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...

  9. 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器

    1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...

随机推荐

  1. c语言中三个点的解释 : variadic

    3.6 Variadic Macros A macro can be declared to accept a variable number of arguments much as a funct ...

  2. Mysql bench执行sql语句批量操作数据所遇到的问题

    一.错误 rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE ...

  3. lxde桌面默认快捷键

    ctrl+alt+左右      选择左右桌面shift+alt+左右     当前窗口送至左右桌面房子键+F1~F4       切换桌面1-4房子键+d           显示桌面alt+esc ...

  4. class DelegatingFilterProxy

    /** * Proxy for a standard Servlet Filter, delegating to a Spring-managed bean that * implements the ...

  5. javascript笔记——工作笔记

    1.防止普通用户缓存静态文件,每次修改之后给静态文件的应用后面加上参数后缀[项目文件较多时最好使用前端构建工具] 比如: <script src="$!webPath/resource ...

  6. android 手机信息获取

    1. adb已安装 2. adb shell getprop 此时已列出所有相关信息

  7. Web2py也有意思的

    多学学,以后可以方便的自己写代码了. 对于各种WEB框架,这也是打一个基础的时候. 相信学入门了,对PHP的,JAVA的WEB框架,都是能理解更深入的. def index(): "&quo ...

  8. 习题3&period;4 &amp&semi; 3&period;5: 求两链表的交集和并集

    #include<stdio.h> #include<stdlib.h> struct Node; typedef struct Node *PtrToNode; typede ...

  9. 8&period;21&period;2 深入finally语句快

    关于finally语句块 1.finally语句块可以直接和try语句块联用. try....finally... 2.try...catch....finally 也可以. 3.在finally语句 ...

  10. php Socket通信

    <?php error_reporting(0); $host = "0.0.0.0"; $port = 1082; $maxUser = 10; set_time_limi ...