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

大连网站模板建站网站漏洞怎么修复

大连网站模板建站,网站漏洞怎么修复,行远金华网站建设公司,会议论坛网站建设_thread是python标准库中的一个低层多线程API#xff0c;可以在进程中启动线程来处理任务#xff0c;并且提供了简单的锁机制来控制共享资源的同步访问。本文就_thread模块的用法和特性做个简单的演示。 文章目录 一、进程和线程的区别二、_thread模块的用法2.1 派生线程2.2…_thread是python标准库中的一个低层多线程API可以在进程中启动线程来处理任务并且提供了简单的锁机制来控制共享资源的同步访问。本文就_thread模块的用法和特性做个简单的演示。 文章目录 一、进程和线程的区别二、_thread模块的用法2.1 派生线程2.2 同步化访问控制2.3 子线程的退出控制2.3.1 通过sleep等待子线程运行结束2.3.2 通过锁的状态监测子进程结束2.3.3 通过共享变量监测子进程结束 一、进程和线程的区别 并行多任务处理是现代操作系统的基本特性一个程序可以同时处理很多任务而不被阻塞。多任务处理的基本方式有两种进程分支和线程派生。 进程分支就是从当前进程复制一个程序副本程序中的内存副本文件描述符等都会被复制子进程改变一个全局对象只是修改本地的副本不会影响到父进程。常用在启动独立的程序。 线程派生和进程分支类似但是子线程依然在原进程中运行所有的子线程都会共享进程中的全局对象相对于进程分支少了一个复制的操作因此更加轻量化且由于共享进程对象相当于自带了线程间的通信机制进程间的通信则需要借助管道套接字信号等外部工具。常用在处理一些轻量级任务。 但这些共享对象的访问可能出现冲突_thread也提供了锁机制来同步化对象访问例如修改一个对象时先获取锁完成后再释放这样就可以保证任意时间点最多能有1个线程能修改这个共享对象防止出现混乱。 二、_thread模块的用法 _thread模块中的start_new_thread可以开启一个新的线程并运行指定程序。 2.1 派生线程 当程序启动时其实它就已经启动了一个线程这个就是主线程。通过_thread.start_new_thread方法传入一个函数对象和一个参数元组就可以开启新线程来执行所传入的函数对象。简单的演示如下 import _thread as threaddef func(id):print(我是 {} 号子线程.format(id))for i in range(5):thread.start_new_thread(func,(i,))上面代码执行示意图如下for循环执行了5次start_new_thread这会开启5个线程每个线程去执行func函数。因为线程是并行的所以输出的顺序并不是0,1,2,3,4而是混乱的。注意34号子线程打印出现了重叠这是因为它们共享一个标准输出流而我们没有做同步化访问控制因而它们同时打印输出。 2.2 同步化访问控制 由于子线程可以共享进程中的资源这既是一个优势方便线程间通信也带来了共享资源访问的问题如果多个子线程同时修改一个共享资源那么就容易出现冲突例如上面的输出重叠。 为了解决这类问题_thread模块中的allocate_lock方法提供了一个简单的锁机制来控制共享访问每次获取共享资源时先获取锁可以保证任何时间点最多只有1个线程可以访问该资源。示例如下 import _thread as threadlock thread.allocate_lock() # 定义一个锁def func(id):with lock: # 用上下文管理器自动控制锁的获取和释放print(我是 {} 号子线程.format(id))for i in range(5):thread.start_new_thread(func,(i,))with lock会自动管理锁对象的获取和释放默认线程会一直等待直到锁的获取如果想要更精细的控制可以使用下面的方式 lock.acquire() # 获取锁 print(我是 {} 号子线程.format(id)) lock.release() # 释放锁lock.acquire()有2个可选的参数blockingTrue代表无法获取锁时等待blockingFalse代表如无法立刻获取锁则返回。timeout-1代表等待的秒数-1代表无限等待此参数只有在blocking设置为True时才能指定。 2.3 子线程的退出控制 _thread派生子线程后如果主线程运行完毕而子线程依然在运行中那么所有子线程就会随着主线程的退出而被终止。 我们在子进程中增加一个sleep来模拟长时间任务让其运行时长超过主线程。将下面的代码保存到一个thread1.py中以一个独立进程启动 import _thread as thread, timelock thread.allocate_lock() # 定义一个锁def func(id):time.sleep(id) # 子线程会睡眠运行时长将超过主线程with lock:print(我是 {} 号子线程.format(id))for i in range(5):thread.start_new_thread(func,(i,))print(主线程结束退出...) # 主线程退出时打印提示可以看到主线程打印了退出提示但子线程却没有任何输出这是因为主线程运行的时间非常短当其退出时所有子线程都终止了。这种情况显然不是我们想看到的。示例图如下 2.3.1 通过sleep等待子线程运行结束 为了解决上面的问题一个简单的解决方案可以在主线程中加一个sleep让其等待一段时间再退出但这个时间我们只能预估。在上面的代码基础上增加一个time.sleep(3)让主线程退出前等待3秒保存为thread2.py再次执行 import _thread as thread, timelock thread.allocate_lock() # 定义一个锁def func(id):time.sleep(id) # 子线程会睡眠运行时长将超过主线程with lock:print(我是 {} 号子线程.format(id))for i in range(5):thread.start_new_thread(func,(i,))time.sleep(3) # 主线程等待3秒再退出 print(主线程结束退出...) # 主线程退出时打印提示可以看到部分子进程运行完毕但还有部分子进程未完成因此这种方法不是很准确虽然你可以给一个足够长的时间来保证所有子进程运行结束但如果进程长时间不结束也会占用系统资源。 2.3.2 通过锁的状态监测子进程结束 _thread.allocate_lock除了可以控制共享对象的访问还可以用来传递全局状态下面定义了包含5把锁的列表每个子线程执行完成后会去获取其中对应位置上的锁在主线程中通过lock.locked()来检查是否所有的锁都被获取当所有锁都被获取时代表所有子线程都结束主线程退出。将下面代码保存到thread3.py中再次运行 import _thread as thread, timelock thread.allocate_lock() # 定义一个锁 exit_locks [thread.allocate_lock() for I in range(5)] # 定义一个列表包含5把锁对应稍后启动的5个子线程def func(id):time.sleep(id) # 子线程会睡眠运行时长将超过主线程with lock:print(我是 {} 号子线程.format(id))exit_locks[id].acquire() # 执行完成后获取exit_locks中对应位置的锁for i in range(5):thread.start_new_thread(func,(i,))for lock in exit_locks:while not lock.locked(): pass # lock.locked()检测锁是否已被获取print(主线程结束退出...) # 主线程退出时打印提示测试时可以发现主线程会在所有子线程执行完毕后立刻退出即不会提前导致子线程终止也不会推迟浪费系统资源。 2.3.3 通过共享变量监测子进程结束 由于子线程可以共享进程中的变量因此子线程中对共享对象的修改在主线程也可以看到我们可以将上面的锁替换为简单的变量可以达到相同的效果下面使用一个共享列表通过在子线程中修改变量值传递状态将下面代码保存为thread4.py并执行 import _thread as thread, timelock thread.allocate_lock() # 定义一个锁 exit_flags [False]*5 # 定义一个全局共享列表包含5个布尔变量Falsedef func(id):time.sleep(id) # 子线程会睡眠运行时长将超过主线程with lock:print(我是 {} 号子线程.format(id))exit_flags[id] True # 执行完成后将共享列表中对应位置的值改为Truefor i in range(5):thread.start_new_thread(func,(i,))while False in exit_flags:pass # 检测列表中是否有False如果全部为Ture代表所有子线程执行完毕print(主线程结束退出...) # 主线程退出时打印提示可以看到主线程会等待子线程执行完毕后退出这种方式相比上面可以节约锁分配的资源看上去也更加简单。 以上即是_thread模块的基本用法。基于_thread模块还有高级的threading模块_threading模块是基于类和对象的高级接口并提供了额外的控制工具例如threading.join()可以实现等待子进程退出。
http://www.w-s-a.com/news/525238/

相关文章:

  • 网站上添加图片的原则优易主机 wordpress
  • 用php做的网站源代码那里有做像美团的网站的
  • 网站建设百科有什么做兼职的网站
  • 创造网站电商网站建设方案道客巴巴
  • 南通设计网站建设wordpress时光轴
  • 郑州做网站企起网站建设 风险
  • 北京市保障性住房建设投资中心网站6大连广告设计与制作公司
  • 建站之星网站模板国内f型网页布局的网站
  • 怎么做网站关键词优化外贸网站 开源
  • 广东公司响应式网站建设设计seo系统是什么
  • 清丰网站建设费用网站建设的前途
  • 网站上那些兼职网页怎么做的北京网页
  • 桂林建站平台哪家好品牌设计公司宣传文案
  • 平面设计和建设网站的区别公司官网静态
  • h5网站建设+案例住房住房和城乡建设部网站
  • 建设股公司网站东莞建设网网上平台
  • 湖州吴兴建设局网站加强网站建设的
  • 茌平做网站公司专业商城网站建设报价
  • 网站结构图怎么画wordpress注册不发送件
  • 个人备案网站可以做论坛吗电商推广方式有哪些
  • 网站建设 自适应国内最近的新闻
  • 校园网站开发背景吴江网站建设公司
  • 网站开发工程师发展趋势山东省建设工程电子信息网站
  • 适合大学生创业的网站建设类型吉林省舒兰市建设银行网站
  • 呼和浩特网站建设哪家好培训学校加盟费用
  • 网站如何做友情链接有道云笔记WordPress
  • 贵阳企业网站建设制作赤峰浩诚网站建设公司
  • asp官方网站微信模板素材
  • wordpress 留言给站长发邮件做百度推广员赚钱吗
  • 北京建站公司做网站价格专门找人做软件的网站