进程与线程的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程与线程的问题相关的知识,希望对你有一定的参考价值。
内存是进程范围or线程范围;
CPU调度时,针对进程or线程;
函数调用堆栈,针对进程or线程。
线程是具体的执行体,每一个进程必定有一个主线程。也是CPU、OS调度的基本单位。
函数当然是在线程内,但更在进程内,通常一个函数一自己的栈,但这个栈空间实际上呢,是在进程意义的,线程可以申请自己的存储,这叫“线程局部存储”。 参考技术A 进程;
进程;
线程。
进程与线程
1.理论
- 互斥锁的作用:
让并发变成串行, 牺牲了执行效率, 保证了数据安全。
- 队列:
必须遵循先进先出。
- IPC(进程间通信):
进程间数据是相互隔离的,若想实现进程间通信,可以利用队列.
- 生产者与消费者:
生产者: 生产数据的
消费者: 使用数据的
解决供需不平衡问题。
- 1.什么是线程?
线程与进程都是虚拟单位,目的是为了更好地描述某种事物.
- 进程: 资源单位
- 线程: 执行单位
- 2.为什么要使用线程?
节省内存资源.
- 开启进程:
1) 开辟一个名称空间,每开启一个进程都会占用一份内存资源.
2) 会自带一个线程
- 开启线程
1) 一个进程可以开启多个线程
2) 线程的开销远小于进程.
注意: 单个进程下开启的线程不能实现并行, 只能实现并发, 开启多个进程并且电脑是多核的情况下才能实现并行.
- 线程之间数据是共享的.
2.手撸创建进程与创建线程的两种方式
- 创建进程
from multiprocessing import Process
import time
def task(name):
print(f'{name} is start')
time.sleep(1)
print(f'{name} is over')
if __name__ == '__main__':
p = Process(target=task, args=('tank',))
p.start()
class MyProcess(Process):
def run(self):
print('hello tank')
time.sleep(1)
print('bye')
if __name__ == '__main__':
p = MyProcess()
p.start()
print('主')
- 创建线程
from threading import Thread
import time
# 方式一:
def task(name):
print(f'{name} is running...')
time.sleep(1)
print(f'{name} is over...')
if __name__ == '__main__':
t1 = Thread(target=task, args=('jason', ))
t1.start()
# 方式二:
class MyThread(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self) -> None:
print(f'{self.name} is running...')
time.sleep(1)
print(f'{self.name} is over...')
if __name__ == '__main__':
t = MyThread('线程1')
t.start()
print('主')
以上是关于进程与线程的问题的主要内容,如果未能解决你的问题,请参考以下文章