怎样建立网站 优帮云线上培训机构排名前十

当前位置: 首页 > news >正文

怎样建立网站 优帮云,线上培训机构排名前十,襄阳做淘宝网站推广,欢迎页网页设计作品欣赏若事与愿违#xff0c;请相信#xff0c;上天自有安排#xff0c;允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X#xff0c;UNIX#xff0c;Linux#xff0c;Windows等#xff0c;都是支持“多任务”的操作系统。 进程 进程#xff1a;就… 若事与愿违请相信上天自有安排允许一切如其所是                                                                                 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS XUNIXLinuxWindows等都是支持“多任务”的操作系统。 进程 进程就是一个程序运行在系统之上那么便称之这个程序为一个运行进程并分配进程ID方便系统管理。线程就是程序在系统中运行起来被系统所管理的一个逻辑概念。 进程就好比一家公司是操作系统对程序进行运行管理的单位 线程 线程线程是归属于进程的一个进程可以开启多个线程执行不同的工作是进程实际工作的最小单位。 线程就好比公司的员工进程可以有多个线程(员工)是进程实际的工作者 操作系统中可以运行多个进程即多任务运行 一个进程内可以运行多个线程即多线程运行 注意点: 进程之间是内存隔离的即不同的进程拥有各自的内存空间。这就类似于不同的公司拥有不同的办公场所。 线程之间是内存共享的线程是属于进程的一个进程内的多个线程之间是共享这个进程所拥有的内存空间的。这就好比公司员工之间是共享公司的办公场所。  二、并行执行 并行执行的意思指的是同一时间做不同的工作。 进程之间就是并行执行的操作系统可以同时运行好多程序这些程序都是在并行执行。 除了进程外线程其实也是可以并行执行的也就是比如一个Python程序,其实是完全可以做到 一个线程在输出你好 一个线程在输出Hello 像这样一个程序在同一时间做两件乃至多件不同的事情我们就称之为多线程并行执行 三、threading模块 绝大多数编程语言都允许多线程编程Pyhton也不例外。 Python的多线程可以通过threading模块来实现。 语法 thread_obj threading.Thread([group [, target [, name [, args [,  kwargs]]]]]) — self在实例化对象并调用方法时会自动传入对象本身的引用。在这里表示当前正在被初始化的线程对象实例 — group暂时无用未来功能的预留参数 — target执行的目标任务名 — name线程名一般不用设置 — args以元组的方式给执行任务传参 — kwargs以字典方式给执行任务传参 — daemon用于设置线程是否为守护线程。 守护线程是一种在后台运行的线程当主线程结束时守护线程通常也会随之结束即使它自己的任务可能还没有完成 示例 演示多线程的使用import time import threadingdef sing():while True:print(唱歌ing)time.sleep(1)def dance():while True:print(跳舞ing)time.sleep(1)if name main:sing_thread threading.Thread(targetsing)dance_thread threading.Thread(targetdance)# 启动线程sing_thread.start()dance_thread.start() 需要传参的话可以通过 ① args参数通过元组(按参数顺序)的方式传参 ② 或使用kwargs参数用字典的形式传参 演示多线程的使用import time import threadingdef sing(msg):while True:print(msg)time.sleep(1)def dance(msg):while True:print(msg)time.sleep(1)if name main:# 以元组方式传参sing_thread threading.Thread(targetsing,args(我要唱歌,))# 以字典方式传参dance_thread threading.Thread(targetdance,kwargs{msg: 我要跳舞})# 启动线程sing_thread.start()dance_thread.start() 四、多线程编程 1.threading模块的使用 thread_obj threading.Thread(targetfunc)        创建线程对象 thread obj.start()        启动线程执行 2.如何传参 ① 元组方式 # 以元组方式传参sing_thread threading.Thread(targetsing,args(我要唱 ② 字典方式 # 以字典方式传参dance_thread threading.Thread(targetdance,kwargs{msg: 我要跳舞} 3.线程类 threading current_thread()    返回与Thread调用方的控制线程相对应的当前对象。 enumerate()            返回Thread当前所有活动对象的列表。 active_count()    返回Thread当前活动的对象数。返回的计数等于所返回列表的长度enumerate()。 main_thread()     返回主要Thread对象。在正常情况下主线程是启动Python解释器的线程。 get_ident()      返回当前线程的“线程标识符”。这是一个非零整数。它的值没有直接的意义。 4.线程对象 threading.Thread() 守护线程 主线程不管守护线程的执行情况只要是其他子线程结束且主线程执行完毕主线程部会关闭。 常见方法 1、setDaemon(True)        可以把子线程设置为主线程的守护线程此方法必须在start之前 2、join()        让主线程等待子线程执行此方法在start之后 示例 守护线程: 主线程不管守护线程的执行情况只要是其他子线程结束且主线程执行完毕主线程都会关闭。 常见方法 1、setDaemon(True)方法可以把子线程设置为主线程的守护线程此方法必须在start之前 2、join()方法让主线程等待子线程执行此方法在start之后 import threading import timedef run1(name, n):for _ in range(n): # _下划线表示临时变量 仅用一次后面无需再用到print(name, time.ctime())time.sleep(1)def run2(name, n):for _ in range(n):print(name, time.ctime())time.sleep(1)if name main:设置子线程t1为守护线程主线程不等t1运行结束只要其他的子线程t2运行结果就会关闭主线程。t1 threading.Thread(targetrun1, args(线程1, 10,)) # 注意args参数类型是元组并以“”结尾t2 threading.Thread(targetrun2, args(线程2, 5,))t1.setDaemon(True) # 设置t1为守护线程t1.start()t2.start()5.线程锁对象 acquire()        锁定        一旦线程获取了锁随后的尝试将其阻塞直到释放为止。任何线程都可以释放它。release()        解锁 互斥锁 threading Lock 递归锁 threading RLock 6.条件对象 threading Condition threading.condition 是 Python 标准库中用于线程间同步的一个高级机制。它将锁(Lock 或RLock )和条件变量组合在一起使得线程可以在满足特定条件时等待并且在条件满足时被唤醒。本质上它提供了一种更灵活的线程间通信方式基于共享资源的某种状态(条件)来控制线程的执行。 可以把Condiftion理解为一把高级的锁它提供了比Lock,RLock更高级的功能允许我们能够控制复杂的线程同步问题。 主要方法 ① acquire 和 release 方法: acquire 方法用于获取关联的锁。这和单独使用锁的操作类似当一个线程调用 acquire 时它会尝试获取锁。如果锁已经被其他线程持有那么这个线程会被阻塞直到锁被释放。 release 方法用于释放关联的锁在完成对共享资源的操作后线程应该释放锁以便其他线程可以获取锁并访问共享资源。例如 import threading cond threading.Condition() cond.acquire() try:# 在这里访问共享资源 finally:cond.release() ②  wait方法 线程调用 wait 方法时会释放当前持有的锁并进入等待状态。这个线程会一直等待直到被其他线程通过 notify 或 notify_all 方法唤醒。被唤醒后线程会重新尝试获取锁只有获取到锁后才能继续执行后续代码。 import threading buffer [] cond threading.Condition() def consumer():with cond:while not buffer:print(消费者缓冲区为空等待数据…)cond.wait()data buffer.pop(0)print(消费者消费了数据, data) ③ notify 和 notify_all 方法 notify方法用于唤醒一个正在等待该条件变量的线程。在共享资源的状态发生改变可能使得等待的线程能够继续执行时应该调用这个方法来唤醒一个等待的线程。 notify_all方法则会唤醒所有正在等待该条件变量的线程。不过只有在这些被唤醒的线程成功获取到锁后才能真正继续执行。例如生产者生产了新的数据后可以调用 notify 方法唤醒等待的消费者线程: import threading buffer [] cond threading.Condition() def producer():with cond:data 1 # 假设生产的数据为1buffer.append(data)print(生产者生产了数据, data)cond.notify() 7.信号量对象 threading Semaphole Semaphore()        内部计数器 BoundedSemaphore()        继承Semaphore类设定信号量边界值 信号量BoundedSemaphore类 信号量通常用于保护容量有限的资源 信号量管理一个内部计数器该内部计数器随每个acquire()调用而递减并随每个 调用而递增release()。 计数器永远不能低于零。当acquire() 发现它为零时它将阻塞直到其他线程调用为止 release()。 import threading, time# 设置信号量的边界值 semaphore threading.BoundedSemaphore(value3)def run():semaphore.acquire() # 加锁print(threading.current_thread().getName(), time.ctime())time.sleep(5)semaphore.release() # 释放if name main:for _ in range(10):t threading.Thread(targetrun)t.start()# 返回Thread当前所有活动对象的列表。通过运行结果我们可以看出系统是先一次性创建10个线程然后根据信号量边界值3一次性运行3个线程其他线程等待锁。print(threading.enumerate()) python多线程的缺陷 1、GIL-全局解释器锁 2、无论系统CPU是几核的,只能使用一个来处理进程8.事件对象 threading Event set(                  将事件对象的内部标志设置为 True 。这意味着等待这个事件的线程将会被唤醒并继续执行 import threading event threading.Event()

其他线程在等待这个事件

event.set() clear()                  将事件对象的内部标志设置为 False 。如果在 clear 之后有线程调用 wait 方法这些线程将会被阻塞直到事件再次被设置。例如: import threading event threading.Event() event.set()

现在清除事件

event.clear() wait(timeoutNone)               如果“Flag值为 False那么当程序执行event.wait方法时就会阻塞如果“Flag值为True那么执行event.wait方法时便不再阻塞 import threading event threading.Event() def worker():print(线程开始等待事件)event.wait()print(事件已触发线程继续执行) t threading.Thread(targetworker) t.start()

在这里可以进行一些其他操作然后设置事件

event.set() is set()                 这是一个只读属性用于检查事件对象的内部标志是否为 true 。可以用于在不阻塞线程的情况下检查事件的状态。例如 import threading event threading.Event() if not event.is_set():print(事件尚未设置) event.set() if event.is_set():print(事件已设置) 事件对象 threading.Event set() 将“Flag”设置为True clear() 将“Flag”设置为False wait() 如果“Flag”值为 False主线程就会阻塞如果“Flag”值为True主线程不再阻塞。 isSet() 判断“Flag”值是否为True。import threading import time#实例化一个事件对象 event threading.Event()def run():while not event.isSet():print(threading.current_thread().getName(), time.ctime())time.sleep(5)event.wait(timeout10) # 阻塞线程为什么timeout10没起到作用if name main:#使用多线程去调用runfor i in range(10):th threading.Thread(targetrun)th.start()#阻塞30s后运行主线程time.sleep(30)event.set() 9.Timer计时器对象 threading Timer 参数(self, interval, function, argsNone, kwargsNone) start()        启动计时器 cancel()        停止计时器(在其动作开始之前) Timer对象import threading# 实例化一个计时器 timer threading.Timerdef hello():print(hello, world)# 10s后执行hello print(开始执行) t timer(10, hello) t.cancel() t.start()