线程

进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位

1.同一个进程内的多个线程共享该进程内的地址资源

2.创建线程的开销远小于创建进程的开销(创建一个进程,就是创建一个车间,涉及到申请空间,而且在该空间内建至少一条流水线,但创建线程,就只是在一个车间        内造一条流水线,无需申请空间,所以创建开销小)

开启线程的两种方式

import time
import random
from threading import Thread def piao(name):
print('%s piaoing' %name)
time.sleep(random.randrange(1,5))
print('%s piao end' %name) if __name__ == '__main__':
#实例化得到一个对象
t1=Thread(target=piao,args=('egon',)) #必须加,号 #调用对象下的方法,开启一个进程
t1.start()
print('主线程')
'''
打印结果:
egon piaoing
主线程
egon piao end
'''

方式一

import time
import random
from threading import Thread class MyThread(Thread):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s piaoing' %self.name)
time.sleep(random.randrange(1,5))
print('%s piao end' %self.name) if __name__ == '__main__':
t1=MyThread('egon')
t1.start() #start会自动调用run
print('主')
'''
打印结果:
egon piaoing

egon piao end
'''

方式二

进程线程的区别

1.开进程的开销远大于开线程
2.同一进程内的多个线程共享该进程的地址空间;而进程之间的内存是隔离的
3.开多个进程,每个进程都有不同的pid;在主进程下开启多个线程,每个线程的pid都和主进程的pid一样
# 1.开进程的开销远大于开线程

import time
from threading import Thread
from multiprocessing import Process def piao(name):
print('%s piaoing' %name)
time.sleep(1)
print('%s piao end' %name) if __name__ == '__main__':
p1 = Process(target=piao, args=('egon',)) # 必须加,号
p1.start() # t1=Thread(target=piao,args=('egon',)) #必须加,号
# t1.start()
print('主线程')
'''
打印结果:
进程
主线程
egon piaoing
egon piao end 线程
egon piaoing
主线程
egon piao end
'''

区别一

from threading import Thread
from multiprocessing import Process n=100
def task():
global n
n=0 if __name__ == '__main__':
# p1 = Process(target=task) # 必须加,号
# p1.start()
# p1.join() t1=Thread(target=task,) #必须加,号
t1.start()
t1.join()
print('主线程',n)
'''
打印结果
进程
主线程 100
证明进程在使用内存空间是互相隔离 线程
主线程 0
证明同一进程内的多个线程共享该进程的地址空间
'''

区别二

from threading import Thread
from multiprocessing import Process,current_process
import os n=100
def task():
# print(current_process().pid) # 查看当前进程的id号
print('子进程PID:%s 父进程PID:%s' %(os.getpid(),os.getppid())) if __name__ == '__main__':
p1 = Process(target=task) # 必须加,号
p1.start() # print('主线程',current_process().pid)
print('主进程', os.getpid())
'''
打印结果
主进程 10576
子进程PID:9744 父进程PID:10576
'''
def task():
print('子进程PID:%s' %(os.getpid())) if __name__ == '__main__':
t1 = Thread(target=task())
print('主进程', os.getpid())
'''
打印结果:
子进程PID:9956
主进程 9956
'''

区别三

Thread的其他属性

Thread对象的方法:

  • t.isAlive() 和 t.is_alive() # 返回线程是否存活
  • t.setName()  # 设置进程名
  • t.getName() # 返回进程名

threading模块的方法:

  • threading.currentThread() # 获取当前线程的对象
  • threading.enumerate()   # 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount() # 返回已经启动的线程数量,与len(threading.enumerate())有相同的结果。
from threading import Thread,currentThread,active_count,enumerate
import time def task():
print('%s is running' %currentThread().getName()) # currentThread()相当于对象t1
time.sleep(2)
print('%s is done' % currentThread().getName()) if __name__ == '__main__':
t=Thread(target=task,name='子线程1')
t.start()
t.setName('儿子线程1') # 修改线程的名
t.join() # 让主线程去等待子线程结束
print(t.getName())
currentThread().setName('主线程') # 设置主线程的名字
print(t.is_alive()) # 查看是否存活
print('主线程',currentThread().getName()) t.join()
print(active_count()) # 活跃的线程数
print(enumerate()) # 拿到当前活跃线程的对象
'''
打印结果:
子线程1 is running
儿子线程1 is done
儿子线程1
False
主线程 主线程
'''

并发编程---线程---开启方式---进程线程的区别----Thread的其他属性的更多相关文章

  1. 并发编程(六)--进程/线程池、协程、gevent第三方库

    一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...

  2. 并发编程(六)——进程/线程池、协程、gevent第三方库

    进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...

  3. java并发编程笔记(三)——线程安全性

    java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...

  4. Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理

    Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...

  5. Java并发编程(您不知道的线程池操作)

    Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...

  6. 【Java并发编程】之二:线程中断

    [Java并发编程]之二:线程中断 使用interrupt()中断线程 ​ 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一 ...

  7. java并发编程笔记(七)——线程池

    java并发编程笔记(七)--线程池 new Thread弊端 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 缺 ...

  8. java并发编程笔记(五)——线程安全策略

    java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...

  9. python并发编程基础之守护进程、队列、锁

    并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ...

随机推荐

  1. 《Python3网络爬虫开发实战》

    推荐:★ ★ ★ ★ ★ 第1章 开发环境配置 第2章 网页基础知识 第3章 网络爬虫基础 第4章 基本库的使用 第5章 解析库的使用 第6章 数据存储 第7章 Ajax数据爬取 第8章 动态渲染页面 ...

  2. linux后台执行命令:&和nohup

    当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件.对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时间段运行(例如凌晨).为 ...

  3. 使用Java提供的MXBean来监控jvm创建了哪些线程

    MBean是一种JavaBean,MBean往往代表的是JMX中的一种可以被管理的资源.MBean会通过接口定义,给出这些资源的一些特定操作: 属性的读和写操作 可以被执行的操作 关于自己的描述信息 ...

  4. Spark RDD Action 简单用例(一)

    collectAsMap(): Map[K, V] 返回key-value对,key是唯一的,如果rdd元素中同一个key对应多个value,则只会保留一个./** * Return the key- ...

  5. 解决Hibernate:could not initialize proxy - no Session(申明:来源于网络)

    解决Hibernate:could not initialize proxy - no Session 地址:http://blog.csdn.net/chenssy/article/details/ ...

  6. 洛谷P1118 数字三角形【dfs】【STL】

    题目链接:https://www.luogu.org/problemnew/show/P1118 题意: 1~n的一个排列,相邻的两项加起来得到下一行. 现在给定最后一行的数字,问最初的1~n的排列是 ...

  7. echarts x轴名称太长

    echarts x轴名称太长了,隐藏一部分,鼠标移到名称上,显示全称 function extension(mychart, type) { let extension = document.getE ...

  8. .NET Core开发日志——Startup

    一个典型的ASP.NET Core应用程序会包含Program与Startup两个文件.Program类中有应用程序的入口方法Main,其中的处理逻辑通常是创建一个WebHostBuilder,再生成 ...

  9. ArcGIS拓扑检查

    对于拓扑检查中的等级参数一直不理解,经过参考资料才明白过来: 注:如果有两个要素参与到拓扑,在修复拓扑错误时会优先移动拓扑级别低的要素来满足匹配拓扑规则要求. 参考资料: https://wenku. ...

  10. .net WebService的使用

    1. WebService可单独作为一个网站,不限平台的被调用. 2. 打开VS,选择新建 3. [WebMethod] 方法上面有这个说明,则表示此方法可被外部调用. 我们添加4个方法:加.减.乘. ...