2401_84519556 2024-07-14 21:32 采纳率: 0%
浏览 6

map卡住了,无反应,不报错, 不结束。注释掉open又ok了!

各位程序员们,为什么?


```python
from time import sleep

from pyquery import PyQuery
from urllib.parse import urljoin
from datetime import datetime, timedelta
import sys
from json import load
from requests import get
from multiprocessing import Pool


url = 'https://fanqienovel.com/page/7381439840480414744'
now_time = datetime.now()
with open('update_time.txt', encoding='utf-8') as f:
    update_date = datetime.strptime(f.read(), '%Y-%m-%d')
if now_time > update_date:
    need_to_update = True
else:
    need_to_update = False
if not need_to_update:
    sys.exit()
doc = PyQuery(url=url)
chapter_list = []
with open('chapter.txt', 'w', encoding='utf-8') as f:
    for chapter in doc('div.chapter>div.chapter-item').items():
        chapter_name = chapter.find('a').text()
        chapter_list.append(urljoin(url,
                                    chapter.find('a').attr('href')))

        f.write(f'{chapter_name}\n')
    with open('update_time.txt', 'w', encoding='utf-8') as f2:
        f2.write((now_time.date()+timedelta(days=1)).isoformat())

dit_data = load(open('dit_date.json', encoding='utf-8'))
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Cookie": "s_v_web_id=verify_lyjwpr6f_HxLaVVd4_rNvo_4RVS_862h_Op4pNZVE1XgG; novel_web_id=7391045291653596699; Hm_lvt_2667d29c8e792e6fa9182c20a3013175=1720861840,1720867345,1720916404; Hm_lpvt_2667d29c8e792e6fa9182c20a3013175=1720916404; HMACCOUNT=BB23AAA9886B8449; csrf_session_id=a47081fce4500af10bd601ab2cabb201; ttwid=1%7C9xskUQxHEZnJhPUbkDSob-NDi1QUaP5MrDgezlPFbac%7C1720916404%7C3c972415ea84add6a07ca9205da5c86b3cd4c1dbce4a3b2ac1c30277860ef068; msToken=4dpC_NUFyMZjF3_P7bhww1Hcw2_FaIPwkTOpDs_UqGaTHUOiPDUT10tGY7i-YQPW1HiEZF0-oksu-mvt_BHvb6G6r7g5z2GBVo2yXRoTxLJ0sY1Tb0WI"

}


def write_chapter_to_files(chapter_list_index):
    chapter_files_name = f'C:/Users/13802/Desktop/小说/第{chapter_list_index + 1}章.txt'
    with open(chapter_files_name, 'w', encoding='utf-8') as f:
        chapter_url = chapter_list[chapter_list_index]
        doc = PyQuery(get(chapter_url, headers=headers).content.decode('utf-8'))
        for p in doc('div.muye-reader-content.noselect p').items():
            f.write('  ')  # muye-reader-content noselect
            for word in p.text():
                try:
                    word = dit_data[str(ord(word))]
                    f.write(word)
                    # print(word)
                except:
                    f.write(word)
                    # print(word)
            f.write('\n\n')
    print(f'爬完{chapter_files_name}')
    sleep(0.5)


if __name__ == '__main__':
    pool = Pool()
    pool.map(write_chapter_to_files, range(len(chapter_list)))
    pool.close()
    pool.join()

调试后发现在·map卡住了,无反应,不报错, 不结束。
神奇的是,注释掉这行又ok了!



```python
    # with open('update_time.txt', 'w', encoding='utf-8') as f2:
        # f2.write((now_time.date()+timedelta(days=1)).isoformat())


这个程序只是我无聊时·写的,可能极不规范。各位请不要喷
说以为什么,这真的对我很重要。
谢谢

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-07-14 21:33
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    从你提供的代码和描述来看,有几个可能的原因导致 pool.map 卡住:

    1. 多进程写文件冲突:在多进程环境下,多个进程尝试写同一个文件可能会造成冲突。尽管你使用的是 with open 语句,但 with open('update_time.txt', 'w', encoding='utf-8') as f2: 这段代码在 for 循环内,这意味着每次循环都可能尝试打开同一个文件,这可能导致文件锁的问题。

    2. 阻塞操作write_chapter_to_files 函数中可能存在阻塞操作,比如网络请求或者写文件操作,这可能导致进程阻塞。

    3. 异常处理:如果 write_chapter_to_files 函数中有未捕获的异常,它可能不会立即抛出,导致进程挂起。

    4. 资源限制:如果 chapter_list 非常大,range(len(chapter_list)) 可能会生成一个很大的迭代器,这可能导致资源消耗问题。

    为了解决这个问题,你可以尝试以下几个步骤:

    • 确保文件写入逻辑正确:检查 with open 块是否正确执行,并且没有无限循环。

    • 同步写入操作:如果你确定是多进程写文件导致的冲突,你可以考虑使用锁(例如 multiprocessing.Lock)来同步写入操作。

    • 检查日期格式:确保 (now_time.date()+timedelta(days=1)).isoformat() 生成的格式是正确的,并且没有异常。

    • 异常捕获:在 write_chapter_to_files 函数中添加异常捕获,以确保任何异常都能被正确处理。

    • 日志记录:添加日志记录或打印语句,以帮助调试 pool.map 的执行过程。

    • 逐步调试:逐步注释掉其他部分的代码,看看是否能找到导致问题的具体位置。

    • 限制进程数:如果 chapter_list 很大,尝试限制进程池的大小,以避免资源耗尽。

    这里是一个修改后的示例,使用了锁来同步写入 update_time.txt 的操作:

    from multiprocessing import Lock
    
    # ... 其他代码 ...
    
    lock = Lock()
    
    def write_chapter_to_files(chapter_list_index):
        global lock
        # ... 其他代码 ...
        with lock:
            with open('update_time.txt', 'w', encoding='utf-8') as f2:
                f2.write((now_time.date()+timedelta(days=1)).isoformat())
        # ... 其他代码 ...
    
    if __name__ == '__main__':
        pool = Pool()
        try:
            pool.map(write_chapter_to_files, range(len(chapter_list)))
        except Exception as e:
            print(f"An error occurred: {e}")
        finally:
            pool.close()
            pool.join()
    

    请注意,使用锁可能会影响程序的性能,因为它限制了并行度。如果问题依然存在,你可能需要进一步调试来确定问题的根本原因。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月14日
  • 创建了问题 7月14日

悬赏问题

  • ¥30 计算机硬件实验报告寻代
  • ¥15 51单片机写代码,要求是图片上的要求,请大家积极参与,设计一个时钟,时间从12:00开始计时,液晶屏第一行显示time,第二行显示时间
  • ¥15 用C语言判断命题逻辑关系
  • ¥15 原子操作+O3编译,程序挂住
  • ¥15 使用STM32F103C6微控制器设计两个从0到F计数的一位数计数器(数字),同时,有一个控制按钮,可以选择哪个计数器工作:需要两个七段显示器和一个按钮。
  • ¥15 在yolo1到yolo11网络模型中,具体有哪些模型可以用作图像分类?
  • ¥15 AD9910输出波形向上偏移,波谷不为0V
  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘
  • ¥15 抖音直播广场scheme