问题贴,今天遇见了个问题,解决了一天都没解决

今天用多线程写了个类,获取ts文件内容,并用另一个线程写入对应的文档,但是预计了个奇怪问题,文件写入,只能写入获取文件数据一半的数据量,到现在也没搞明白怎么回事。

直接上代码:

import threading
import requests
import time
from queue import Queue
import urllib3
urllib3.disable_warnings()

#这个就是ts文件的列表
ts_list=list()
# base_url = 'https://v4.cdtlas.com/20220223/MKPjICFW/1100kb/hls/index.m3u8'

# 页面地址:https://www.acfun.cn/v/ac33003549
base_url = 'https://ali-safety-video.acfun.cn/mediacloud/acfun/acfun_video/c185ef40f16fac2e-c4c2fc4890da062a1d1e0f2eb10f0634-hls_1080p_2.m3u8?pkey=ABASsT6ICcJOVagTydVvSQcR4002-YEqr_dEGDVGKunt4KjMuu-qcHnk69tpuMrirtXONFSMWIk9nA46NCwXkEPvd87umIrlEzuGoW7c-iQiFqoSzt9XAXqSdaWBbqFg02fP3iObVSJn9ZlyZtjCzg6PeSzaFhs8WpWSLGIviiL82UZjxgkdfD6hurOBhfeyfnrzCgZTh-3X5S6bTj6XACT1IUDz38_GDfMtonlVfZ0C5g&safety_id=AAIC1Add8kyLWL7-w9SQPeRw'
ii =0
ij = 0

class Producer(threading.Thread):

    def __init__(self, url_queue, data_queue,name_queue, *args, **kwargs):
        super(Producer, self).__init__(*args, **kwargs)
        self.url_queue = url_queue
        self.data_queue = data_queue
        self.name_queue = name_queue

    def run(self) -> None:
        # 从url_page中拿url
        while True:
            if self.url_queue.empty():
                print("Produceer  完毕   !!")
                break
            url = self.url_queue.get()
            self.get_data(url)

    def get_data(self,url):
        print('*'*100+url +'*'*100)
        global ii
        # print("~~~~~~" + "拿到第{}个数据,******".format(ii) + "~~~~~~")
        ii = ii + 1
        res = requests.get(url,verify = False)
        data = res.content
        self.data_queue.put(data)
        time.sleep(2)


        # name = self.name_queue.get().split('.ts?')[0]
        # with open("{}.ts".format(name), 'ab+') as f:
        #     f.write(data)
        #     f.flush()
        #     f.close()



class Consumer(threading.Thread):

    def __init__(self, url_queue, data_queue, name_queue, *args, **kwargs):
        super(Consumer, self).__init__(*args, **kwargs)
        self.url_queue = url_queue
        self.data_queue = data_queue
        self.name_queue = name_queue
        print(self.name_queue)

    def run(self) -> None:
        while True:
            if self.data_queue.empty():
                if self.url_queue.empty():
                    print('写入完毕'*300)
                    return
            data = self.data_queue.get()
            print(self.name_queue.get())
            global  ij
            print("写入数据量:{}".format(ij))
            ij = ij +1
            name = self.name_queue.get().split('.ts?')[0]
            with open("{}.ts".format(ij), 'ab+') as f:
                f.write(data)
                f.flush()
                f.close()

def parse_ts(data):
    try:
        data = str(data)
        finish_data = []
        for line in data.split('\n'):
            if line.endswith('.ts'):
                finish_data.append(line)
            elif line.find('.ts?') >= 0:
                finish_data.append(line)
            else:
                print('*'*20+'\n'+'解析错误,未解析到需要的ts文件,具体内容如下:'+line+'\n'+'*'*20)
    except Exception as e:
        import traceback

        traceback.print_exc()
        print('*'*20+"报错" * 50+'*'*20)
    finally:
        return finish_data



def main():
    name_queue = Queue()
    url_queue = Queue()
    data_queue = Queue()

    # 准备url
    item = 0
    for x in ts_list:
        # 判断是否需要拼接,有的ts文件是直接自带全部链接的
        if x.find('http://') >=0 or x.find('https://') >= 0:
            url = x
        else:
            # 需要去除base_url最后一个字段,
            url = '{}/{}.ts'.format(base_url.rsplit('/',1)[0],x)
        # url_queue.put(url)
        url_queue.put(url)
        item = item+1
        # name_queue.put(x)
        name_queue.put(x)
    print("总数据量是:{}".format(item))


    # 创建生产者、消费者进程
    for x in range(8):
        t = Producer(url_queue, data_queue, name_queue)
        t.start()

    for x in range(8):
        c = Consumer(url_queue, data_queue,name_queue)
        c.start()



if __name__ == '__main__':
    # 获取m3u8的url,根据url获取ts列表
    res = requests.get(base_url,verify = False)
    if res.status_code == 200:
        ts_list = parse_ts(res.text)
        print(ts_list)
        main()
    else:
        print("请求m3u8文件错误")

先记录下,等过几天有空了,再详细解决下。 

<think>好的,我需要帮助用户找到项目中遇到问题解决方法,特别是IT解决方案。根据用户提供的三个引用,我应该先理解每个引用的内容,然后结合他们的需求来组织答案。 首先,引用[1]主要讲的是Visual Studio中解决方案文件的结构和作用,提到.sln文件如何组织和加载项目。这可能和项目结构或编译环境的问题有关。引用[2]讨论了IT项目解决方案的组成部分,包括概述、需求分析、解决方案、实施计划等,这为用户提供了编写解决方案的大纲。引用[3]是关于集团公司IT规划的全面方法论,涵盖战略、应用规划、实施计划等多个方面,适合更高层次的规划问题。 用户的问题是想寻找项目中遇到问题解决方法,特别是IT解决方案。所以需要从项目管理和技术实施两个角度来回答。首先,可能的问题类型包括技术实现、需求不明确、资源不足、沟通不畅等。针对这些,需要结合引用中的内容,比如引用[2]的结构化方法来分析问题,引用[3]的规划方法论来系统化处理。 接下来,我应该分步骤说明解决方法: 1. **问题定位与需求分析**:使用引用[2]中提到的问题分析部分,明确需求,识别根本原因。 2. **结构化解决方案设计**:参考引用[2]中的方案概述、解决方案设计部分,制定详细的技术和管理方案。 3. **利用开发工具与资源管理**:引用[1]提到的解决方案文件管理,可能需要优化项目结构或资源配置。 4. **实施与迭代优化**:引用[3]中的实施计划和治理模式,分阶段推进并持续改进。 5. **案例参考与知识复用**:引用[2]中的附加案例,借鉴类似问题解决经验。 此外,需要生成相关问题,可能涉及具体的方法论应用、工具使用、案例研究等。 需要确保回答结构清晰,使用中文,数学表达式正确(如果有的话),但当前内容可能不涉及数学公式。同时,引用标识要自然添加在对应的部分末尾,比如提到需求分析时引用[2],提到实施计划时引用[3]。 最后,检查是否符合用户可见层的格式要求,不使用Markdown,分点回答,相关问题和引用正确。</think>### 项目问题解决方法与IT解决方案 在IT项目中,问题解决需要结合系统化的分析方法和结构化实施方案。以下是分步骤的解决策略: #### 1. **问题定位与需求分析** - **明确问题范围**:通过访谈、文档审查等方式,确定问题的具体表现和影响范围。例如,是技术实现问题(如代码编译失败)、需求冲突,还是资源分配不足? - **需求与问题关联**:参考引用[2],需将问题与项目需求对应,例如功能未达标可能源于需求定义模糊或技术选型不当。 - **工具辅助定位**:若涉及开发环境问题(如Visual Studio项目加载失败),可检查.sln文件配置是否完整,或依赖项是否缺失[^1]。 #### 2. **结构化解决方案设计** - **方案框架搭建**:依据引用[2],解决方案需包含: - **方案概述**:目标与预期成果。 - **技术路径**:如采用微服务架构解决系统耦合问题。 - **实施计划**:分阶段任务与里程碑。 - **技术验证与原型设计**:对关键模块进行PoC(概念验证),例如通过快速排序算法优化数据处理性能(见示例代码)。 ```python # 示例:快速排序优化数据预处理 def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[0] return quick_sort([x for x in arr[1:] if x < pivot]) + [pivot] + quick_sort([x for x in arr[1:] if x >= pivot]) ``` #### 3. **资源与工具整合** - **开发环境管理**:利用.sln文件规范项目结构,确保依赖项和编译配置的一致性。 - **资源分配优化**:根据引用[3],通过IT治理模式合理分配人力与预算,例如引入敏捷开发减少资源浪费。 #### 4. **实施与迭代优化** - **分阶段推进**:按引用[3]中的实施计划,将项目拆解为需求开发、测试、部署等阶段,并设置检查点。 - **持续改进**:通过监控系统(如APM工具)收集运行时问题,迭代优化代码或架构。 #### 5. **案例复用与知识管理** - **参考历史方案**:如引用[2]中提到的附加案例,复用类似场景的解决经验。 - **文档沉淀**:将解决方案纳入知识库,便于团队后续快速响应同类问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值