并发编程 - 线程 - 1.开启线程的两种方式/2.进程与线程的区别/3.Thread对象的其他属性或方法/4.守护线程
1.开启线程的两种方式:
进程,线程:
进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位)
1.同一个进程内的多个线程共享该进程内的地址资源
2.创建线程的开销远小于创建进程的开销(创建一个进程,就是创建一个车间,涉及到申请空间,
而且在该空间内建至少一条流水线,但创建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小)
# 方式1:
from threading import Thread
import time def sayhi(name):
time.sleep(2)
print('%s say hello'%name) if __name__ == "__main__":
t=Thread(target=sayhi,args=('alice',))
t.start()
print('主线程') # 一个进程,一个主线程,开启了一个线程 # 方式2:
from threading import Thread
import time class Sayhi(Thread):
def __init__(self,name):
super().__init__()
self.name = name def run(self):
time.sleep(2)
print('%s say hello'%self.name) if __name__ == "__main__":
t = Sayhi('alice')
t.start()
print('主线程')
2.进程与线程的区别:
1.开进程的开销远大于开线程
2.同一进程内的多个线程共享该进程的地址空间
3.瞅一眼pid
# 1.
import time
from threading import Thread
from multiprocessing import Process def piao(name):
print('%s piaoing' %name)
time.sleep(2)
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
"""
# 2.
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() # 彼此隔离的 n = 100 t1=Thread(target=task)
t1.start()
t1.join() # 共享地址空间 n = 0 print('主线程',n)
"""
主线程 100
"""
"""
主线程 0
"""
# 3.
from threading import Thread
from multiprocessing import Process,current_process
import os def task():
print(current_process().pid)
print(os.getpid(),os.getppid()) if __name__ == '__main__':
# p1=Process(target=task)
# p1.start() # pid 不一样
# p1.join() t1=Thread(target=task)
t1.start() # 线程pid 一样
t1.join() print('主线程',current_process().pid)
print('主线程',os.getpid(),os.getppid())
"""
38780
38780 43168
主线程 43168
主线程 43168 12480
"""
"""
58912
58912 12480
主线程 58912
主线程 58912 12480
"""
3.Thread对象的其他属性或方法:
currentThread().getName()
t.setName()
t.is_alive()
t.isAlive()
t.join()
active_count()
enumerate()
from threading import Thread,currentThread,active_count,enumerate
import time def task():
print('%s is running'%currentThread().getName())
time.sleep(2)
print('%s is done'%currentThread().getName()) if __name__ == "__main__":
t = Thread(target=task,name='子线程1')
t.start()
# t.join()
# print(t.getName())
# t.setName('儿子线程1')
# currentThread().setName('主进程')
# print(t.is_alive())
# print(t.isAlive())
# print('主线程:',currentThread().getName())
t.join()
# print(active_count()) # 2 没有join 1 有join
print(enumerate()) # [<_MainThread(MainThread, started 41144)>] """
Thread-1 is running
Thread-1
主线程 MainThread
Thread-1 is done
"""
"""
子线程1 is running
子线程1
主线程 MainThread
子线程1 is done
"""
"""
子线程1 is running
主线程 MainThread
儿子线程1 is done
"""
"""
子线程1 is running
主线程: 主进程
子线程1 is done
"""
"""
子线程1 is running
子线程1 is done
False
False
主线程: MainThread
"""
4.守护线程:
一个进程什么时候被销毁,
1.不开线程,代码完毕,该进程就被销毁
2.主线程等到所有子线程死了后,他才死
守护线程等到所有的子线程死了后,他才死
from threading import Thread
import time def sayhi(name):
time.sleep(2)
print('%s say hello' %name) if __name__ == '__main__':
t=Thread(target=sayhi,args=('egon',))
# t.setDaemon(True) #必须在t.start()之前设置
t.daemon=True
t.start() print('主线程')
print(t.is_alive()) # t 跟着死了 一个线程内没有开启非守护线程
"""
主线程
True
""" from threading import Thread
import time def foo():
print(123)
time.sleep(4)
print("end123") def bar():
print(456)
time.sleep(3)
print("end456") if __name__ == '__main__':
t1=Thread(target=foo)
t2=Thread(target=bar) t1.daemon=True
t1.start()
t2.start()
print("main-------")
"""
123 foo time.sleep(1)
456
main-------
end123
end456
"""
"""
123 foo time.sleep(4)
456
main-------
end456
"""
并发编程 - 线程 - 1.开启线程的两种方式/2.进程与线程的区别/3.Thread对象的其他属性或方法/4.守护线程的更多相关文章
- python 之 并发编程(开启子进程的两种方式,进程对象的属性)
第九章并发编程 同一个程序执行多次是多个进程 import time import os print('爹是:',os.getppid()) #父进程PID,(pycharm) print('me ...
- 线程池提交任务的两种方式:execute与submit的区别
Java中的线程池在进行任务提交时,有两种方式:execute和submit方法. 一.execute和submit的区别 execute只能提交Runnable类型的任务,无返回值.submit既可 ...
- 8 并发编程-(线程)-多线程与多进程的区别&Thread对象的其他属性或方法
1.开启速度 在主进程下开启线程比 开启子进程快 # 1 在 主进程下开启线程 from threading import Thread def work(): print('hello') if ...
- 并发编程 - 进程 - 1.开启子进程的两种方式/2.查看pid/3.Process对象的其他属性或方法/4.守护进程
1.开启子进程的两种方式: # 方式1: from multiprocessing import Process import time def task(name): print('%s is ru ...
- [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]
[操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...
- DJango中开启事务的两种方式
目录 Django中开启事务的两种方式 第一种 第二种 Django中开启事务的两种方式 第一种 from django.db import transaction with transaction. ...
- python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)
9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...
- 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发
子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...
- Java并发编程:Java实现多线程的几种方式
在Java中,多线程主要的实现方式有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService ...
随机推荐
- 0068 Git入门的第一节课
这是 猴子都懂的Git入门 的学习笔记 Git安装与配置 下载安装Git:http://git-scm.com/ 从开始菜单启动Git Bash $ git --version git version ...
- echarts 百度图表
手册说明 http://echarts.baidu.com/option.html 3.0版本加了很多新属性可以看以上链接 此文用的3.x版本 第一步 引入 <script src=" ...
- 本系列love2d示例代码错误集中整理
3.输入和音乐 音乐不是循环播放的,可以在love.audio.play(music) 之前添加music:setLooping(true)
- oracle初始操作
oracle登录 sqlplus sys/oracle as sysdba 这个登录之后呢 会出现这个: Connected to an idle instance. 这一步是连接上 [oracle ...
- C语言 · 删除数组中的0元素
算法提高 6-9删除数组中的0元素 时间限制:1.0s 内存限制:512.0MB 编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,C ...
- Entity Framework(五):使用配置伙伴创建数据库
在上一篇文章中讲了如何使用fluent API来创建数据表,不知道你有没有注意到一个问题.上面的OnModelCreating方法中,我们只配置了一个类Product,也许代码不是很多,但也不算很少, ...
- 扩展KMP - HDU 4333 Revolving Digits
Revolving Digits Problem's Link Mean: 给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于.等于.大于原串. ...
- java基础知识小小结
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- selenium测试环境搭建(一)
selenium测试环境搭建 下载资源 1. selenium-java-2.53.0.zip 下载地址:http://pan.baidu.com/s/1dFDf27Z 2. Firefox Set ...
- Spring RestTemplate post
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); map.add("auditPara ...