首页 > 其他分享 >线程理论及threading模块

线程理论及threading模块

时间:2022-11-21 17:23:05浏览次数:48  
标签:name Thread threading 线程 模块 time print import

线程理论及threading模块

线程理论

线程和进程在使用方式和调度策略上十分的相似,两者的本质区别在于

  • 进程:进程是资源单位,表示一块内存空间
  • 线程:线程是执行单位,真正的执行代码指令

一个进程中可以有多条线程,就像一个车间中可以有多条作业线,一个进程中至少有一个线程。

开设进程所要消耗的资源更大,而一个进程下开设线程就会快很多。

同一个进程下的多线程的数据是共享的,并不像多进程一样数据隔离。

创建线程的代码实现

方式1

from threading import Thread
import time


def task(name):
    print(f'{name} is running')
    time.sleep(0.1)
    print(f'{name} is over')


start_time = time.time()
print(time.time() - start_time)
t_list = []
for i in range(100):  # 连续开100个线程
    t = Thread(target=task, args=('用户%s'%i,))
    t.start()
    t_list.append(t)  # 将线程存到列表
for t in t_list:
    t.join()  # 遍历等待所有线程结束后再执行后续代码
print(time.time() - start_time)  # 0.11784076690673828

t = Thread(target=task, args=('jason',))
t.start()
print('主线程')

创建线程时只将提交的任务开设一个新的执行单位执行,不会像开进程一样将整个py文件的资源重新运行一遍,所以不必加main语句来判断执行文件。

这里也可以看见对于执行时间原本需要0.1秒任务,同时开启100个线程的用时也就多一点,而开100个进程的执行时间就会长很多,因为开设进程消耗的时间和资源都较大。

方式2

from threading import Thread
import time

class MyThread(Thread):  # 也是派生类的方法
    def run(self):  # 任务
        print('run is running')
        time.sleep(1)
        print('run is over')

obj = MyThread()
obj.start()
print('主线程')

线程的诸多特性

join方法

与进程的join方法一致,是让主线程等待子线程结束后再执行后续代码。

from threading import Thread
import time
 
 
def task(name):
    print(f'{name} is running')
    time.sleep(1)
    print(f'{name} is over')
 
t = Thread(target=task, args=('jason', ))
t.start()
t.join()
print('主线程')

线程数据共享

import time
from threading import Thread

money = 1001

def task():
    time.sleep(0.2)
    global money
    money -= 100

t_list = []
for i in range(10):
    t = Thread(target=task)
    t.start()
    t_list.append(t)
for t in t_list:
    t.join()
print(money)  # 1

event事件

事件的作用是帮助我协调多个线程间的某些动作的发生顺序。

代码实现如下。

from threading import Thread, Event
import time

event = Event()  # 创造了一个事件对象


def light():
    print('红灯亮着的 所有人都不能动')
    time.sleep(3)
    print('绿灯亮了 油门踩到底 给我冲!!!')
    event.set()  # 事件发出信号


def car(name):
    print('%s正在等红灯' % name)
    event.wait()  # 等待信号发出再执行后续代码
    print('%s加油门 发车了' % name)


t = Thread(target=light)  # 先启动红绿灯计时
t.start()  # light中等待3秒后会亮起绿灯,同时让event发射信号
for i in range(20):
    t = Thread(target=car, args=('熊猫PRO%s' % i,))  # 有二十个车任务线程在等灯
    t.start()  # 车都在等绿灯才加油门发车。

其他方法

from threading import Thread,current_thread,active_count
  • current_thread().name:运行此句代码的线程的名字属性
  • active_count():运行此句代码时,本进程中还存在的线程数量

标签:name,Thread,threading,线程,模块,time,print,import
From: https://www.cnblogs.com/Leethon-lizhilog/p/16912031.html

相关文章

  • 万字详解 Java 线程安全,面试必备!
    来源:blog.csdn.net/u014454538/article/details/985158071.Java中的线程安全Java线程安全:狭义地认为是多线程之间共享数据的访问。Java语言中各种操作共享的数据有5种......
  • 15.多线程并发在电商系统下的追本溯源(2)
                                                         ......
  • WPF 后台线程操作界面元素不卡UI界面线程 Dispatcher
    经常要考虑的,后台的耗时操作不要卡死主界面的问题。<StackPanelVerticalAlignment="Center"><Labelx:Name="lblHello">欢迎你光临WPF的世界!</Label><ButtonName......
  • 02.核心模块
    corespring以Bean的方式来组织和管理java应用中的各个组件,及其关系,Beanfactory使用loc模式将应用的配置和依赖性规范与实际的应用代码分开,bean使用依赖注入的方式,实现控......
  • C++多线程
    c++多线程多线程其实非常简单多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程......
  • 饿汉模式,懒汉模式线程安全问题
    饿汉模式:上来不管三七二十一直接创建对象再说。饿汉模式创建方式:1.先创建一个私有的构造函数(防止其它地方直接实例化)2.定义私有变量3.提供公共的获取实例的方法pub......
  • Python psutil模块 Process 类
    psutil模块Process类如果需要了解其他跟多理解的=》Python知识点合集 如果需要查看官方手册解读的=》Process类......
  • 线程的私有空间
    线程内部的全局变量如果需要在一个线程内部的各个函数调用都能访问、但其它线程不能访问的变量,这就需要新的机制来实现,我们称之为Staticmemorylocaltoathread(线程局......
  • 【Java】JDK5.0新增的创建多线程的方式:实现Callable接口,使用线程池
    1.实现Callable接口方式和实现Runnable接口相比call()可以有返回值。call()可以抛出异常,被外面的操作捕获,获取异常信息。Callable是支持泛型的。实现Callable接口......
  • python - 模块1
    模块相当于库,有标准库和第三方库模块名不要跟库名一致print(sys.path)#打印环境变量print(sys.argv)#打印相对路径os模块#跟系统交互os.system("")#跟系统交......