python中的ThreadPoolExecutor

本文介绍了一个使用Python编写的并发爬虫程序,通过多线程技术和请求库实现高效抓取网页数据。该爬虫从CSV文件读取配置,并针对不同的分类发起登录及数据提交请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/bin/env python3

import requests
import datetime
import threading
import csv
import json
import random
from concurrent.futures import ThreadPoolExecutor

pool = ThreadPoolExecutor(16)
threadLocal = threading.local()

reader = csv.reader(open('***.csv'))
category = ['wilson1', 'wilson2', 'wilson3']


def push(i):
    initialized = getattr(threadLocal, 'initialized', None)
    if initialized is None:
        threadLocal.initialized = True
        threadLocal.s = requests.Session()
        threadLocal.s.post(
            'http://***/***',
            json={
                'username': 'admin',
                'password': '1'
            })
    category_id = category.index(i[3])
  
    threadLocal.s.post(
        'http://***/***',
        json={
            'category_id': category_id,
            'name': i[1],
            'author': i[4],
        })


for i in reader:
    pool.submit(push, i)
Python中,可以使用`concurrent.futures`模块中的`ThreadPoolExecutor`类来进行多线程处理。在使用`ThreadPoolExecutor`调用WebSocket时,可以通过`websocket`库中提供的异步方法来实现。 下面是一个简单的例子,假设我们要使用`ThreadPoolExecutor`类来调用WebSocket,代码如下: ```python import websocket import concurrent.futures def on_message(ws, message): print(message) def on_error(ws, error): print(error) def on_close(ws): print("### closed ###") def on_open(ws): def run(*args): ws.send("Hello, world!") time.sleep(1) ws.close() print("thread terminating...") executor.submit(run) if __name__ == "__main__": websocket.enableTrace(True) ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message=on_message, on_error=on_error, on_close=on_close) ws.on_open = on_open with concurrent.futures.ThreadPoolExecutor() as executor: executor.submit(ws.run_forever) ``` 上面的代码中,我们首先导入了`websocket`和`concurrent.futures`模块,然后定义了一些回调函数,包括接收到消息时的回调函数`on_message`、发生错误时的回调函数`on_error`、关闭连接时的回调函数`on_close`和建立连接时的回调函数`on_open`。在`on_open`回调函数中,我们创建了一个新线程,并将其提交给线程池中的线程执行。 最后,我们通过`with concurrent.futures.ThreadPoolExecutor() as executor:`语句块来创建一个线程池对象,并使用`executor.submit(ws.run_forever)`语句将WebSocket连接的运行方法提交给线程池。这样就可以实现多线程处理WebSocket了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值