Python线程进程及性能测试工具Locust

基础知识

由于现在计算机基本都使用的是多核CPU,CPU 是多核时是支持多个线程同时执行。为了充分发挥CPU性能,一般会使用多线程的方式提高程序的执行效率。

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。总结线程是一个基本的 CPU 执行单元,并依托进程提供资源存活运行。

进程

进程是指一个程序在给定数据集合上的一次执行过程,是系统进行资源分配和运行调用的独立单位。可以简单地理解为操作系统中正在执行的程序。也就说,每个应用程序都有一个自己的进程。一个进程有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变量、优先级类、最小和最大的工作空间(内存空间),还要有至少一个线程。
每一个进程启动时都会最先产生一个线程,即主线程。然后主线程会再创建其他的子线程。
进程是与运算相关的一簇资源。

线程与进程区别

  1. 线程需要在进程中执行,进程可以有多个线程,但有且只有一个主线程。
  2. 多线程共享同个地址空间、打开的文件以及其他资源,多进程共享物理内存、磁盘、打印机以及其他资源。
  3. 同一个进程中的线程共享同一内存空间,共享所有线程数据,但是进程之间的内存空间和数据是独立的。
  4. 同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。
  5. 一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。
  6. 对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。
  7. 创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。线程的启动速度快,进程启动速度慢。

Python中的线程

Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。

Python运用

多线程编程

Python提供两个模块进行多线程的操作,thread 和threading,threading 是 thread的更加高级和便利的封装,一般应用采用threading进行多线程的操作。

# -*- coding: utf8 -*-

import threading

import time

 

print threading.currentThread() #返回当前的线程变量。

print threading.enumerate()#返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

print threading.activeCount()#返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

 

#创建线程方法1,使用threading.Thread()

def run(n):

    print("current task:", n)

 

    print threading.currentThread()

 

def createThreadOne():

    t1 = threading.Thread(target=run,args=("thread 1",))

    t2 = threading.Thread(target=run, args=("thread 2",))

    t1.start() #start(),启动线程活动

    t2.start()

    t1.join()#join([time]): 效果是使主线程等待子线程中止才推出。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

    t2.join()#线程有一个布尔属性叫做daemon。表示线程是否是守护线程,默认取否。当程序中的线程全部是守护线程时,程序才会退出。只要还存在一个非守护线程,程序就不会退出。主线程是非守护线程。

 

 

#创建线程方法2,继承threading.Thread来自定义线程类,重写run方法

class MyThread(threading.Thread):

    def __init__(self, n):

        super(MyThread, self).__init__()  # 重构run函数必须要写

        self.n = n

 

    def run(self):

        print("current task:", self.n)

        print self.getName()

        time.sleep(10)#sleep的时候是不会占用cpu的,在sleep的时候操作系统会把线程暂时挂起。

        print threading.currentThread() #输出当前线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值