一、什么是线程?
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)