Python中多线程threading.Thread()使用

107 阅读2分钟

一、什么是线程?

1、线程也叫轻量级进程,是操作系统能够进行运算调度的最小单元,被包含在进程之中, 是进程中的实际运作单位。

2、线程自己不拥有系统资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源

3、一个线程可以创建和撤销另一个线程,同一个进程之间的多个线程可以并发执行

二、为什么要使用多线程?

1、进程之间不能共享内存,但线程之间共享内存非常容易

2、操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价小的多。因此,使用多线程来实现多任务并发执行比使用多进程的效率高

三、Python中多线程threading.Thread()使用

python中内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,简化了python的多线程编程。

# 普通创建方式:
 def run(n):
     print('task',n)
     time.sleep(1)
     print('2s')
     time.sleep(1)
     print('1s')
     time.sleep(1)
     print('0s')
     time.sleep(1)

 if __name__ == '__main__':
     t1 = threading.Thread(target=run,args=('t1',))     # target是要执行的函数名(不是函数),args是函数对应的参数,以元组的形式存在
     t2 = threading.Thread(target=run,args=('t2',))
     t1.start()
     t2.start()
 
# 自定义线程:继承threading.Thread来定义线程类,其本质是重构Thread类中的run方法

class MyThread(threading.Thread):
     def __init__(self,n):
         super(MyThread,self).__init__()   #重构run函数必须写
         self.n = n

     def run(self):
         print('task',self.n)
         time.sleep(1)
         print('2s')
         time.sleep(1)
         print('1s')
         time.sleep(1)
         print('0s')
         time.sleep(1)

 if __name__ == '__main__':
     t1 = MyThread('t1')
     t2 = MyThread('t2')
     t1.start()
     t2.start()


# 多线程共享全局变量:线程时进程的执行单元,进程时系统分配资源的最小执行单位,所以在同一个进程中的多线程是共享资源的

 g_num = 100
 def work1():
     global  g_num
     for i in range(3):
         g_num+=1
     print('in work1 g_num is : %d' % g_num)

 def work2():
     global g_num
     print('in work2 g_num is : %d' % g_num)

 if __name__ == '__main__':
     t1 = threading.Thread(target=work1)
     t1.start()
     time.sleep(1)
     t2=threading.Thread(target=work2)
     t2.start()

原文链接:blog.csdn.net/qq_36044523…

四、利用多线程发送多个请求


# encoding=utf-8
import requests
import threading
import time

def send_request(url, num_requests, method='GET', headers=None, data=None):
    try:
        for _ in range(num_requests):
            if method == 'GET':
                response = requests.get(url, headers=headers)
            elif method == 'POST':
                response = requests.post(url, headers=headers, data=data)
            else:
                raise ValueError("Invalid HTTP method")

            print("Response from {}: {}".format(url,response.status_code))
    except requests.exceptions.RequestException as e:
        print("Error occurred while sending request to {}: {}".format(url,str(e)))

def send_multiple_requests(urls, num_requests, methods=None, headers=None, data=None):
    start_time = time.time()
    threads = []

    for i in range(len(urls)):
        url = urls[i]
        num_request = num_requests[i]
        method = methods[i] if methods else 'GET'
        header = headers[i] if headers else None
        req_data = data[i] if data else None
        
       # 参数
        thread = threading.Thread(target=send_request, args=(url, num_request, method, header, req_data))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    end_time = time.time()
    duration = end_time - start_time
    print("Total requests sent: {}".format(sum(num_requests)))
    print("Total duration: {} seconds".format(duration))
    print("Requests per second: {}".format(sum(num_requests) / duration))

# 用法示例
urls = ["http://10.10.69.203", "http://10.10.69.203"]
num_requests = [5, 25]
methods = ['GET', 'POST']
headers = [{'User-Agent': 'Mozilla/5.0', "X-Real-IP": "1.1.1.1"}, {'User-Agent': 'Python/3.8', "X-Real-IP": "1.1.1.2"}]
data = [{'key1': 'value1'}, {'key2': 'value2'}]

send_multiple_requests(urls, num_requests, methods, headers, data)