Python | 进程 & 线程的理解拾遗

进程和线程的理解

线程是操作系统能够进行预算调度的最小单位,它包含在进程中是进程中的实际运作单位。

Linux 进程有父进程和子进程,window 系统的进程是平等关系

一个标准的线程有线程 ID ,当前指令指针,寄存器集合和堆栈组成,在许多系统中,创建一个线程比创建一个进程要快 1- 100 倍。

每一个进程都认为自己独占所有的计算器硬件资源

进程就是独立的王国,进程间不可以随便共享数据

线程就是省份,同一个进程内的线程可以共享进程的资源,每一个进程拥有自己独立的堆栈。

Python 中的进程和线程

进程会启动一个解释器进程,线程共享一个解释器进程。

线程

创建一个最简单的线程程序

import threading
def worker():
  print("hello world")
t = threading.Thread(target=worker) # 创建线程对象
t.start()  #启动

使用 print  函数打印(因为线程切换回打断 print 函数的执行 )会导致线程不安全,推荐使用 logging

import logging
import threading
FORMAT = '%(asctime-15s\t [%(threadName)s, %(thread)8d] %(message)s)'
logging.basicConfig(level=logging.INFO, format=FORMAT)
def worker():
  for i in range(100):
    logging.info("{} is running".format(threading.current_thread().name))
for i in range(5):
  name = "workr-{}".format(i)
  threading.Thread(target=worker).start()

线程安全:线程执行一段代码,不会产生不确定的结果,那这段代码就是线程安全的

daemon 线程和 no-daemon 线程

这里的 daemon 不是 linux 中的守护进程

如果有 non-daemon 线程的时候,主线程退出时也不会杀掉所有daemon线程,直到所有 non-daemon 线程全部结束,如果还有 daemon 线程,主线程需要退出,会结束所有的 daemon 线程退出

threading.local

Python 提供 threading.local 类,将这个类实例化得到一个全局对象,但是不同线程使用这个对象存储的数据其他线程看不见。

ctx = threading.local()
ctx.x = 123

Threading.local 类构建了一个大字典,其元素是每一线程实例的地址为 key 和线程对象引用线程单独的字典的映射

{id(Thread)->(ref(Thread),thread-local dict)}

通过 threading.local 实例就可以在不同的线程中,安全的使用线程独有的数据,做到线程间数据隔离,如同本地变量一样安全。

threading.Timer

Threading.Timer 继承自 Thread,这个类用来定义多久执行一个函数

class threading.Timer(interval, function, args=None, kwargs=None)

Start 方法执行之后,Timer 对象会处于等待状态,等待了 interval 之后,开始执行 function 函数的

如果在执行函数之前的等待期间使用了 cancle 方法就会跳过执行函数结束。

def worker():
  print("hello world")
t = threading.Timer(5,worker)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值