• 突击线程堡垒


    线程

    什么是线程?

      类似于进程,进程是正在进行的程序,本身进程就是一个资源单位。线程好比工厂里车间里面的流水线,车间就是一个个的进程,

    流水线是用来生产的,因此线程是一个个的执行单位。

      也就是说进程包含线程(一个或者多个线程)

    线程为什么会存在?

      我们会想,既然有了进程,进程能干的就可以了,为什么还要线程呢?

      对于这个问题,进程肯定有缺点,正好是线程的优点。那么,进程有哪些缺点呢?

      1.对于开启一个进程,首先需要申请一个内存空间,所用的时间相比不会少;

      2.再者,对于创建了一个进程来说,他需要导入模块或者将代买从新拷贝一份到内存中才能执行,这里的时间也不会少。

    创建线程的两种方式

    类似于进程,一毛一样。

     1 # 创建方式一
     2 # 导入相关模块
     3 from threading import Thread
     4 import time
     5 
     6 # 定义线程函数
     7 def task(name):
     8     print('%s is running' %name)
     9     time.sleep(2)
    10     print('%s is over' % name)
    11 
    12 
    13 # 在创建线程中,main可写可不写
    14 if __name__ == '__main__':
    15     t = Thread(target=task, args=('wanglei',))
    16     t.start()
    17     print('')
    18 
    19 
    20 
    21 ========打印结果:==============
    22 wanglei is running
    23 24 wanglei is over

     

     1 # 创建方式二
     2 # 导入相关的模块
     3 from threading import Thread
     4 import time
     5 
     6 
     7 # 定义类方式
     8 class MyThread(Thread):
     9 
    10     def __init__(self, name):
    11         super().__init__()
    12         self.name = name
    13 
    14     # 定义类方法
    15     def run(self):
    16         print('%s is running' % self.name)
    17         time.sleep(2)
    18         print('%s is over' % self.name)
    19 
    20 
    21 # 实例化线程对象
    22 t = MyThread('wanglei')
    23 # 执行线程
    24 t.start()
    25 print('')
    # 执行的结果和上面的一样

    线程之间的数据共享

    场景:定义在主线程的变量可以通过子线程去修改吗?

     1 # 导入模块
     2 from threading import Thread
     3 
     4 
     5 # 定义在主线程中的变量x
     6 x = 100
     7 
     8 # 定义子线程的修改方法
     9 def task():
    10     global x
    11     x = 666
    12 
    13 
    14 t = Thread(target=task)
    15 
    16 t.start()
    17 
    18 =======输出结果:=========
    19 666

    线程之间的互斥锁

    场景:修改数据

     1 from threading import Thread,Lock
     2 import time
     3 import random
     4 
     5 # 生成锁
     6 mutex = Lock()
     7 
     8 # 定义变量n
     9 n = 100
    10 
    11 # 通过方法去修改n的值
    12 def task():
    13     global n
    14     mutex.acquire()
    15     tmp = n
    16     time.sleep(0.1)
    17     n = tmp -1
    18     mutex.release()
    19 
    20 
    21 # 定义列表存放生成的线程对象100个
    22 t_list = []
    23 for i in range(100):
    24     t = Thread(target=task)
    25     t.start()
    26     t_list.append(t)
    27 
    28 # 等待所有子线程结束
    29 for t in t_list:
    30     t.join()
    31 
    32 print(n)
    33 
    34 
    35 ========输出结果:========
    36 0

    线程中的守护线程

    守护线程:在线程中,在主线程结束的情况下,要等待所有非守护子线程结束才能结束。不同于进程,进程是随着守护的子进程结束而结束。而线程公用一块进程资源,因此即使在守护线程结束的情况下,不排除有其他子线程的存在。

     1 from threading import Thread
     2 import time
     3 
     4 
     5 def task(name):
     6     print('%s is running'%name)
     7     time.sleep(1)
     8     print('%s is over'%name)
     9 
    10 if __name__ == '__main__':
    11     t = Thread(target=task,args=('王磊',))
    12     # t.daemon = True
    13     t.start()
    14     print('')
  • 相关阅读:
    使用 ESP8266 制作 WiFi 干扰器
    苹果手机连接Wifi认证机制
    TK2 USB修复
    WiFi其他方法和WiFi事件响
    获取与esp8266连接的客户端的Mac地址 IP 端口 控制停止等问题
    WiFi其他方法和WiFi事件响应
    Arduino内部网页代理,网页穿透,公网访问Arduino内部网页
    ESP8266远程OTA升级
    分级基金及套利策略:申购套利、赎回套利、低折套利
    maven安装
  • 原文地址:https://www.cnblogs.com/wanglei957/p/10826616.html
Copyright © 2020-2023  润新知