python——线程与多线程基础
我们之前已经初步了解了进程、线程与协程的概念,现在就来看看python的线程。下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程。这篇博客将要讲一些单线程与多线程的基础,它们在执行中对cpu资源的分配,帮助还不了解多线程的小伙伴一招get写多线程代码的技能。已经了解的请自行跳过。
单线程

从上面的图中我们可以看出,这段代码执行了10秒多,这就是一段单单线程的一条道走到黑的代码,它们顺序执行,该sleep的时候就sleep,该print的时候就print。右边的图是python执行的时候所占用的cpu的情况。
多线程
但是,我们是无法忍受一共打印10个数,每个数之间还要sleep这个事实的,所以又出现了多线程,当一个线程sleeping的时候,cpu就去执行其他线程的内容了。例如:

看上面的图,我们引入了threading模块,并使用Thread类实现了一个多线程的程序,这时,我们仅仅用了9毫秒的时间,就执行完了10个数字的打印。是因为我们将print这件事情,放到了多个线程中去执行,那么这几个线程就几乎同步去做事,表面上线程都在执行完打印之后进入了休眠状态,但是一个线程休息的间隙,cpu就可以去完成其他线程的任务了。看最右侧的时间图,我放大了时间轴,其实每一个颜色块就代表了他们在cpu中执行时占用的时间,它们之间的差别很小,大概是秒的-3次方这个数量级,足矣被我们忽略了,所以我们感觉他们是同时执行的,当线程执行sleep的时候,他们也几乎会同时开始计时,同时结束。我们看中间的结果图,打印的并不像上面单线程那么漂亮,这也是各个线程抢占输出资源的结果。于是我们知道了,多线程的执行几乎是同步的,并且共享内存,但是它会产生资源抢占的情况。
get一段多线程代码

看上面的图,就是这样,其实开启一个线程非常简单,只需要引入一个threading包,然后初始化一个Thread的对象,将方法名和其参数作为Thread类初始化的参数传进去,再使用Thread的对象调用start方法,我们就启动了一个新的线程。我们可以在自己的程序中按照需求起一个或很多个线程。就像上面那样。
#!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'Eva_J' import threading
import time def printNum(a):
print 'num:',a
time.sleep(1) def printStr(str1,str2):
print str1,':',str2
time.sleep(1) t_0 = threading.Thread(target=printNum ,args= (999,))
t_0.start() t_1 = threading.Thread(target=printStr ,args= ('this is the arg','string',))
t_1.start() for a in range(10):
t = threading.Thread(target=printNum ,args= (a,))
t.start()
threading Code
参考文献:
python线程指南:http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
武老师内部专享文章:python线程、进程和协程:http://www.cnblogs.com/wupeiqi/articles/5040827.html
python——线程与多线程基础的更多相关文章
- python——线程与多线程进阶
之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...
- python 线程、多线程
复习进程知识: python:主进程,至少有一个主线程 启动一个新的子进程:Process,pool 给每一个进程设定一下执行的任务:传一个函数+函数的参数 如果是进程池:map函数:传入一个任务函数 ...
- 第 11 章 python线程与多线程
一.什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程. 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位. 多线程(即多 ...
- 多线程基础(五)NSThread线程通信
5.多线程基础 线程间通信 什么叫线程间通信 在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另一个线程 在1个线程中执行完特定任务后, ...
- Java多线程基础:进程和线程之由来
转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...
- 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...
- python基础-第九篇-9.1初了解Python线程、进程、协程
了解相关概念之前,我们先来看一张图 进程: 优点:同时利用多个cpu,能够同时进行多个操作 缺点:耗费资源(重新开辟内存空间) 线程: 优点:共享内存,IO操作时候,创造并发操作 缺点:抢占资源 通过 ...
- 1、Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
随机推荐
- PL/SQL Developer主数据库连接和窗口连接切换
Oracle开发者估计对PL/SQL Developer都非常熟悉了,里面有些小的功能点大概还有些初学者没发现.PL/SQL Developer支持多连接多窗口,下面详细说说. 主连接的概念 打开PL ...
- js 一个自写的 监测类
自从认识了jQuery后,很多页面加载入口,都放在document.ready里面.但是有时候这个觉得ready加载太慢, 这个[监测类 ]就开始产生了 效果类似这个. 每10毫秒检查一次,直到加载了 ...
- Oracle Contact By的使用
1.概述 Oracle “CONNECT BY”是层次查询子句,一般用于树状或者层次结果集的查询 2.使用方式 2.1.通过Connect by 生成序列 Oracle 构造一个月份的天数 ) s_d ...
- 程序员面试大揭秘——应聘微软、亚马逊、谷歌、苹果等IT公司你都要做什么准备?
对于多数求职者而言,面试好似一个迷局.你去了,见了几个面试官,答了一堆问题,然后,或两手空空离开,或幸运地拿到录用通知. 你有没有想过: 面试结果是怎么得出的? 面试官会不会互相交流? 公司最看重哪些 ...
- wireshark常用过滤条件
抓取指定IP地址的数据流: 如果你的抓包环境下有很多主机正在通讯,可以考虑使用所观察主机的IP地址来进行过滤.以下为IP地址抓包过滤示例: host 10.3.1.1:抓取发到/来自10.3.1.1的 ...
- JAVA异常处理机制的简单原理和应用
- 2016湖大校赛 L题 The Sequence likes Ladder
题意:S1=a,Sn=a*(Sn-1)^k%m,且有(a,m)=1,给出i,求Si. 思路:首先我们可以写出Sn的通项a^(1+k+k^2+...k^n-1);其次注意到m的范围是10000以内,所以 ...
- MySQL为什么需要一个主键
主键 表中每一行都应该有可以唯一标识自己的一列(或一组列). 一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID 或 雇员社会保险号. 主键(primary key) 一列(或一 ...
- CentOS 安装 Dubbo 管理控制台
安装之前需要安装zookeeper详情http://www.cnblogs.com/zuge/p/6141101.html Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费 ...
- Android性能分析之TraceView的使用
TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它会产 ...