线程

  进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位。在单个进程中同时运行多个线程完成不同的工作,称为多线程。

  同一进程内的多个线程是共享该进程的资源。

  创建新的线程开销要远远小于开启新的进程。

threading模块

  线程的threading模块与进程的multiprocessing模块很类似。  

  模块下的类:

    Thread

    active_count

    enumerate

    current_thread

  方法:

    start()

    join()

    daemon() 守护线程和守护进程有点不一样。主线程在执行完所有非守护线程后,主线程结束,守护线程随之结束。

  示例:

rom threading import Thread,current_thread,active_count,enumerate
import time
def bar():
print('%s is running'%current_thread().getName() )
time.sleep(2)
print('%s is over'%current_thread().getName() )
def foo():
print('%s is running' % current_thread().getName())
time.sleep(5)
print('%s is over' % current_thread().getName())
if __name__ == '__main__':
t1=Thread(target=bar)
t2=Thread(target=foo)
t1.start()
t2.daemon=True
t2.start()
print(enumerate())
print(active_count())
print('%s is 主线程' %current_thread().getName())

  输出:

Thread-1 is running
Thread-2 is running
[<_MainThread(MainThread, started 816)>, <Thread(Thread-1, started 7528)>, <Thread(Thread-2, started daemon 13788)>]
3
MainThread is 主线程
Thread-1 is over

  PS:

  多线程用于IO密集型,如socket,爬虫,web
  多进程用于计算密集型,如金融分析

  

  

from multiprocessing import Process
from threading import Thread
import time
def foo():
sum=0
for i in range(100000000):
sum+=i if __name__ == '__main__':
start_time=time.time()
n=os.cpu_count()
l=[]
for i in range(n):
t=Thread(target=foo,) #41s
# p=Process(target=foo,) #9.89s
# l.append(p)
l.append(t)
# p.start()
t.start()
for p in l:
# p.join()
p.join()
print('time:',time.time()-start_time)

作业:

  三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件。

from threading import Thread
msg_l=[] #
format_l=[] #这两个是关键呀,相当于进程中的全局变量,进程中的数据(全局变量)是共享的,任何一个线程都可以访问的到。
def talk(): #三个函数,开启三个线程,做到各司其职,互不干涉,存取数据到进程中的全局变量取就可以了。
while True:
msg=input('>>: ').strip()
if not msg:continue
msg_l.append(msg) def format_msg():
while True:
if msg_l:
res=msg_l.pop()
format_l.append(res.upper()) def save():
while True:
if format_l:
with open('db.txt','a',encoding='utf-8') as f:
res=format_l.pop()
f.write('%s\n' %res) if __name__ == '__main__':
t1=Thread(target=talk)
t2=Thread(target=format_msg)
t3=Thread(target=save)
t1.start()
t2.start()
t3.start()

  思路还是很6的。

线程与threading模块的更多相关文章

  1. <python的线程与threading模块>

    <python的线程与threading模块> 一 线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而thre ...

  2. python全栈开发 * 进程池,线程理论 ,threading模块 * 180727

    一.进程池 (同步 异步 返回值) 缺点: 开启进程慢 几个CPU就能同时运行几个程序 进程的个数不是无线开启的 应用: 100个任务 进程池 如果必须用多个进程 且是高计算型 没有IO型的程序 希望 ...

  3. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  4. Python 浅析线程(threading模块)和进程(process)

    线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程与线程 什么 ...

  5. Python的进程、线程和threading模块

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 怀念在学校念书的时候,我不小心触碰到了错误,老师会说:你错了:而我却总是倔强得以为自己没错.我的内心是不屑的,直到在真理面前 ...

  6. Python的并发并行[1] -> 线程[0] -> threading 模块

    threading模块 / threading Module 1 常量 / Constants Pass 2 函数 / Function 2.1 setprofile()函数 函数调用: thread ...

  7. python全栈开发 * 线程锁 Thread 模块 其他 * 180730

    一,线程Thread模块1.效率更高(相对于进程) import time from multiprocessing import Process from threading import Thre ...

  8. python成长之路【第十一篇】:网络编程之线程threading模块

    一.threading模块介绍 threading 模块建立在 _thread 模块之上.thread 模块以低级.原始的方式来处理和控制线程,而 threading 模块通过对 thread 进行二 ...

  9. Python——threading模块(线程)

    一.threading模块的对象 Thread:表示一个执行线程的对象 Lock:锁 Rlock:可重入锁对象 Condition:条件变量对象,使得一个线程等待另一个线程满足特定的“条件” Even ...

随机推荐

  1. 2018.3.31 java中的递归

    java中的递归 1.概念 定义一个方法时,出现本方法调用本方法的过程,称之为递归 2.特点 必然有一个边界条件 使用递归代码往往更简洁,可读性强 3.什么时候使用递归 n的阶乘和n的累加定义 f(n ...

  2. @Param注解在dao层的使用

    有时在前台用ajax传过来许多参数,不知道在mybatis如何封装,就要用到@Param注解了,这时就不需要在映射文件写传入参数了,这种方法虽然比较取巧,但还是很实用的,如下图:

  3. 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究

    概述 关于树的概念很多,B树,B+树,红黑树等等. 但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的树结构的介绍,全都是狗屁.没有哪个中文网站是真正精确解释树的定义的,尤其是百度百科. 下面我要 ...

  4. 《毛毛虫团队》第七次作业:团队项目设计完善&编码

    一:实验名称:团队项目设计完善&编码 二:实验目的与要求 掌握软件编码实现的工程要求. 三:实验步骤 任务一:团队软件项目设计完善: 任务二:团队软件项目编码实现: 任务三:在团队博客发布博文 ...

  5. 剑指offer题目分类

    1. 链表 1. 从尾到头打印链表 2. 链表中倒数第k个结点 3. 反转链表 4. 合并两个排序的链表 5. 复杂链表的复制 6. 复杂链表的复制 7. 两个链表的第一个公共结点 8. 链表中环的入 ...

  6. Dojo的ready函数:dojo.ready(以前的dojo.addOnLoad)

    dojo的dojo/domReady!插件和dojo/ready的区别:     In simple cases,dojo/domReady! should be used. If an app us ...

  7. 关于flyme5显示不到和卸载不到旧应用解决方法

    笔者买入一台mx5,升级flyme5后旧应用没有显示出来,而且在设置的应用管理都没显示旧应用. 通过adb命令: adb shell pm list packages显示所有包名, 查看自己要删除应用 ...

  8. Angular-网页定时刷新

    类上方引入“OnInit”.“OnDestroy” import { OnInit, OnDestroy } from '@angular/core'; 类实现“OnInit”.“OnDestroy” ...

  9. [bzoj]1930 pacman吃豆豆

    Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他 ...

  10. GoogleTest 之路2-Googletest 入门(Primer)

    Why googletest? 为啥要用GoogleTest呢? googletest 是由测试技术Team 开发的带有google 特殊的需求和限制的测试框架. 不管你在什么平台上写C++代码,go ...