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

什么博客可以做网站惠阳开发网站建设

什么博客可以做网站,惠阳开发网站建设,佛山企业网,广告创意设计作品python使用多线程实例讲解 1 进程和线程 1.1 进程和线程的概念 进程(process)和线程(thread)是操作系统的基本概念。 进程是资源分配的最小单位#xff0c;线程是CPU调度的最小单位。 线程是程序中一个单一的顺序控制流程#xff0c;进程内一个相对独立的、可调度的执行单…python使用多线程实例讲解 1 进程和线程 1.1 进程和线程的概念 进程(process)和线程(thread)是操作系统的基本概念。 进程是资源分配的最小单位线程是CPU调度的最小单位。 线程是程序中一个单一的顺序控制流程进程内一个相对独立的、可调度的执行单元是系统独立调度和分派CPU的基本单位。 一、什么是进程 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据它们只有在被读取到内存中被操作系统调用时才开始它们的生命周期。 进程是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈及其他记录其运行轨迹的辅助数据。操作系统管理在其上运行所有的进程并为这些进程公平分配时间、进程也可以通过fork和spawn操作来完成其他的任务。 不过进程有自己的内存空间数据栈等所以只能使用进程间通讯(Inter Process communication, IPC)而不能直接共享信息。 二、什么是线程 线程跟进程有些相似不同的是所有的线程运行在同一个进程中共享相同的运行环境。 线程有开始顺序执行和结束三部分。它有一个自己的指令指针记录自己运行到什么地方。线程的运行可能被抢占(中断)或暂时的被挂起(睡眠)让其他线程运行这叫做让步。 一个进程中的各个线程之间共享同一片数据空间所以线程之间可以比进程之间更方便地共享数据以及相互通讯。线程一般都是并发执行的正是由于这种并发和数据共享的机制使得多个任务的合作变成可能。 实际上在单CPU的系统中真正的并行是不可能的每个线程会被安排成每次只运行一小会然后就把CPU让出来让其他的线程去运行。在进程的整个运行过程中每个线程都只做自己的事在需要的时候跟其他的线程共享运行的结果。 当然这样的共享并不是完全没有危险的。如果多个线程共同访问同一片数据则由于数据访问的顺序不同有可能导致数据结果的不一致的问题即竞态条件race condition。同样大多数线程库都带有一些列的同步原语来控制线程的执行和数据的访问。 另一个需要注意的是由于有的函数会在完成之前阻塞住在没有特别为多线程做修改的情况下这种“贪婪”的函数会让CPU的时间分配有所倾斜导致各个线程分配到的运行时间可能不尽相同不尽公平。 1.2 进程与线程的区别 (1)地址空间和其它资源(如打开文件)进程间相互独立同一进程的各线程间共享。某进程内的线程在其它进程不可见。 (2)通信进程间通信IPC线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助以保证数据的一致性。 (3)调度和切换线程上下文切换比进程上下文切换要快得多。 (4)在多线程OS中进程不是一个可执行的实体。 总结进程和线程可以类比为火车和车厢。 (1)线程在进程下行进(单纯的车厢无法运行)。 (2)一个进程可以包含多个线程(一辆火车可以有多个车厢)。 (3)不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车比如站点换乘)。 (4)同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)。 (5)进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)。 (6)进程间不会相互影响一个线程挂掉将导致整个进程挂掉一列火车不会影响到另外一列火车但是如果一列火车上中间的一节车厢着火了将影响到该趟火车的所有车厢 (7)进程可以拓展到多机进程最适合多核不同火车可以开在多个轨道上同一火车的车厢不能在行进的不同的轨道上 (8)进程使用的内存地址可以上锁即一个线程使用某些共享内存时其他线程必须等它结束才能使用这一块内存(比如火车上的洗手间【互斥锁mutex】)。 (9)进程使用的内存地址可以限定使用量(比如火车上的餐厅最多只允许多少人进入如果满了需要在门口等等有人出来了才能进去【信号量semaphore】)。 1.3 多进程与多线程的概念与区别 (1)一个进程相当于一个要执行的程序它会开启一个主线程多线程会开启多个子线程 (2)python设计之初没有多核CPU所以它的多线程是一种并发操作(伪并行)它相当于把CPU的时间片分成一段一段很小的片段然后分给各个线程交替进行由于每个片段都很短所以看上去像平行操作。 举个例子现在有一个16核的CPU一个要执行的数据读取任务A我们将A分成多个进程并行操作每个进程放到一个核上。但是如果将这个任务A用一个进程开多个线程完成的话虽然一个核心同一时间处理一个线程按理说16核可以同时处理16个线程未考虑超线程技术但由于python的缺陷这里面的多线程依然是并发(伪并行)的所以效率低。 1.4 Python的全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设置之初就考虑到要在解释器主循环中同时只有一个线程在执行就像单CPU的系统中运行多个进程那样内存中可以存放多个程序但任意时刻只有一个程序在CPU中运行。 虽然Python解释器可以运行多个线程但任意时刻只有一个线程在解释器中运行。对Python虚拟机的访问由全局解释器锁(global interpreter lockGIL)来控制正是这个锁能保证同一时刻只有一个线程在运行。 在多线程环境中Python虚拟机按以下方式执行 (1) 设置GIL (2) 切换到一个线程去运行 (3) 运行a. 指定数量的字节码的指令或者b. 线程主动让出控制可以调用time.sleep(0) (4) 把线程设置为睡眠状态 (5) 解锁GIL (6) 再次重复以上所有步骤在调用外部代码如C/C扩展函数的时候GIL将会被锁定直到这个函数结束为止由于这期间没有Python的字节码被运行所以不会做线程切换。编写扩展的程序员可以主动解锁GIL。不过Python开发人员则不用担心在这些情况下你的Python代码会被锁住。 2 python多线程实例 2.1 普通的单线程 # -*- coding: utf-8 -*- from time import ctime,sleepdef music(name):for i in range(2):print(I was listening to music.----{}:{}.format(name, ctime()))sleep(1)def coding(code):for i in range(2):print(I was coding codes!----{}:{}.format(code, ctime()))sleep(5)if __name__ __main__:music(my love music)coding(python code)print(all over.----{}.format(ctime()))我们先听了一首音乐通过for循环来控制音乐的播放了两次每首音乐播放需要1秒钟sleep()来控制音乐播放的时长。接着我又敲了会代码每段代码需要5秒钟通过for循环敲了两遍。 2.2 多线程 python提供了两个模块来实现多线程thread 和threading thread有一些缺点在threading得到了弥补我们直接学习threading 就可以了。继续对上面的例子进行改造引入threadring来同时播放音乐和写代码 2.2.1 设置守护线程(不等待) 在Python中守护线程是指在程序运行时在后台运行的线程当主线程结束时守护线程也会随之结束。守护线程通常用于执行一些不需要阻塞主线程或长时间运行的任务。 # -*- coding: utf-8 -*- from time import ctime,sleep import threadingdef music(name):for i in range(2):print(I was listening to music.----{}:{}.format(name, ctime()))sleep(1)def coding(code):for i in range(2):print(I was coding codes!----{}:{}.format(code, ctime()))sleep(5)if __name__ __main__:threads []t1 threading.Thread(targetmusic, args(my love music,))threads.append(t1)t2 threading.Thread(targetcoding, args(python code,))threads.append(t2)for t in threads:# setDaemon(True)将线程声明为守护线程,必须在start()方法调用之前设置t.setDaemon(True)t.start()# 子线程启动后主线程也继续执行下去print(all over.----{}.format(ctime()))因为是守护线程当主线程执行完最后一条语句print后,没有等待子线程,直接就退出了,同时子线程也一同结束。 从执行结果来看子线程(muisc 、coding)和主线程(print all over)都是同一时间启动但由于主线程执行完结束所以导致子线程也终止。 若让主线程多等待8秒则会正常输出。 if __name__ __main__:threads []t1 threading.Thread(targetmusic, args(my love music,))threads.append(t1)t2 threading.Thread(targetcoding, args(python code,))threads.append(t2)for t in threads:# setDaemon(True)将线程声明为守护线程,必须在start()方法调用之前设置t.setDaemon(True)t.start()# 子线程启动后主线程也继续执行下去sleep(8)print(all over.----{}.format(ctime()))2.2.2 不设置守护线程(等待) if __name__ __main__:threads []t1 threading.Thread(targetmusic, args(my love music,))threads.append(t1)t2 threading.Thread(targetcoding, args(python code,))threads.append(t2)for t in threads:t.start()# 子线程启动后主线程也继续执行下去print(all over.----{}.format(ctime()))主线程执行结束以后进程会等待子线程运行结束后进程才会退出。 2.2.3 线程阻塞join方法 对上面的程序加了个join()方法用于等待线程终止。join()的作用是在子线程完成运行之前这个子线程的父线程将一直被阻塞。 if __name__ __main__:threads []t1 threading.Thread(targetmusic, args(my love music,))t2 threading.Thread(targetcoding, args(python code,))threads.append(t2)threads.append(t1)for t in threads:t.setDaemon(True)t.start()t.join()# 子线程t1运行结束后,继续执行主线程print(all over.----{}.format(ctime()))使用子线程t1阻塞2秒后运行结束线程t2还没运行结束。
http://www.w-s-a.com/news/985018/

相关文章:

  • 网站打不开显示asp苏州注册公司需要多少钱
  • 凡科建站登录官网wordpress主题有什么用
  • 西安双语网站建设怎么做网页动图
  • 宝安自适应网站建设无锡新区企业网站推广
  • 肇庆建设局网站cpanel 安装wordpress
  • 长春启做网站多少怎样换wordpress域名
  • 山西网站建设情况汇总vs2010 c 建设网站
  • 网站推广策划书 精品深圳市住建局和建设局官网
  • 住房和城乡建设部干部学院网站一般做公司网站需要哪几点
  • 网站制作流程详解(学做网站第一步)免费个人网站模版ps
  • 狮山网站建设公司微信平台软件开发
  • 绥芬河网站建设学网站开发的能找什么工作
  • 网站域名申请之后如何做网站微信公众号网页版登录入口
  • 网站优化图片省级精品课程网站
  • 婚纱摄影的网站模板怎么做网站自己当站长
  • 江西建设部网站wordpress弹出式广告
  • 工商年检在哪个网站做中国建设银行个人登录
  • seo做网站郑州巩义网站建设
  • 建设银行网站机构特点业务发展网站推广工作计划
  • 国家信用信息系统年报seo推广赚钱
  • 公司建设网站价格表广州免费拍卖公司
  • 知行网站建设wordpress文章半透明
  • 建设网站的虚拟机配置建设银行宁波分行招聘网站
  • 济南网站开发xywlcn网络推广服务合同模板
  • 品牌网站制作流程图用asp做网站题目
  • 兰州市建设厅网站河南网站建设问一问公司
  • 高档网站建设前端网站大全
  • 深圳电力建设公司网站互联网网站有哪些
  • 淅川网站建设如何在百度上做自己的网站
  • 网站制作 南通有学给宝宝做衣服的网站吗