python出现RuntimeError错误

本文详细解析了在使用Python多进程进行网络爬虫时遇到的RuntimeError错误,提供了修正代码示例,并解释了如何通过调整代码结构来避免此类问题,确保程序正确运行。

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

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

上面是出现的错误解释

下面是出现错误代码的原代码

import multiprocessing as mp
import time
from urllib.request import urlopen,urljoin
from bs4 import BeautifulSoup
import re

base_url = "https://morvanzhou.github.io/"

#crawl爬取网页
def crawl(url):
    response = urlopen(url)
    time.sleep(0.1)
    return response.read().decode()

#parse解析网页
def parse(html):
    soup = BeautifulSoup(html,'html.parser')
    urls = soup.find_all('a',{"href":re.compile('^/.+?/$')})
    title = soup.find('h1').get_text().strip()
    page_urls = set([urljoin(base_url,url['href'])for url in urls])
    url = soup.find('meta',{'property':"og:url"})['content']
    return title,page_urls,url

unseen = set([base_url])
seen = set()
restricted_crawl = True

pool = mp.Pool(4)
count, t1 = 1, time.time()
while len(unseen) != 0:                 # still get some url to visit
    if restricted_crawl and len(seen) > 20:
            break
    print('\nDistributed Crawling...')
    crawl_jobs = [pool.apply_async(crawl, args=(url,)) for url in unseen]
    htmls = [j.get() for j in crawl_jobs]      # request connection

    print('\nDistributed Parsing...')
    parse_jobs = [pool.apply_async(parse, args=(html,)) for html in htmls]
    results = [j.get() for j in parse_jobs]    # parse html

    print('\nAnalysing...')
    seen.update(unseen)         # seen the crawled
    unseen.clear()              # nothing unseen

    for title, page_urls, url in results:
        print(count, title, url)
        count += 1
        unseen.update(page_urls - seen)     # get new url to crawl
print('Total time: %.1f s' % (time.time()-t1))    # 16 s !!!

这是修改后的正确代码

import multiprocessing as mp
import time
from urllib.request import urlopen,urljoin
from bs4 import BeautifulSoup
import re

base_url = "https://morvanzhou.github.io/"

#crawl爬取网页
def crawl(url):
    response = urlopen(url)
    time.sleep(0.1)
    return response.read().decode()

#parse解析网页
def parse(html):
    soup = BeautifulSoup(html,'html.parser')
    urls = soup.find_all('a',{"href":re.compile('^/.+?/$')})
    title = soup.find('h1').get_text().strip()
    page_urls = set([urljoin(base_url,url['href'])for url in urls])
    url = soup.find('meta',{'property':"og:url"})['content']
    return title,page_urls,url

def main():
    unseen = set([base_url])
    seen = set()
    restricted_crawl = True

    pool = mp.Pool(4)
    count, t1 = 1, time.time()
    while len(unseen) != 0:                 # still get some url to visit
        if restricted_crawl and len(seen) > 20:
                break
        print('\nDistributed Crawling...')
        crawl_jobs = [pool.apply_async(crawl, args=(url,)) for url in unseen]
        htmls = [j.get() for j in crawl_jobs]      # request connection

        print('\nDistributed Parsing...')
        parse_jobs = [pool.apply_async(parse, args=(html,)) for html in htmls]
        results = [j.get() for j in parse_jobs]    # parse html

        print('\nAnalysing...')
        seen.update(unseen)         # seen the crawled
        unseen.clear()              # nothing unseen

        for title, page_urls, url in results:
            print(count, title, url)
            count += 1
            unseen.update(page_urls - seen)     # get new url to crawl
    print('Total time: %.1f s' % (time.time()-t1))    # 16 s !!!


if __name__ == '__main__':
    main()

综上可知,就是把你的运行代码整合成一个函数,然后加入

if __name__ == '__main__':
    main()

这行代码即可解决这个问题。

具体原理可以看看这篇知乎介绍

https://www.zhihu.com/question/49136398

### Python 中的 Runtime Error Runtime Error(运行时错误)是指程序在执行过程中发生的错误。这些错误通常不会导致编译失败,但会在程序运行期间引发问题。常见的运行时错误包括但不限于:类型不匹配、内存不足、非法操作等。 在 Python 中,运行时错误可以通过异常处理机制捕获和解决。以下是一些常见的运行时错误及其解决方案: #### 1. 类型不匹配错误 当代码中预期的数据类型与实际提供的数据类型不一致时,可能会引发运行时错误。例如,如果代码期望一个 `float` 类型的标量,但却提供了一个 `half` 类型的值,则会触发错误[^1]。 **解决方案**: - 检查代码中涉及的数据类型是否正确。 - 如果需要使用半精度浮点数(`half`),确保相关库支持该类型,并根据需要调整代码逻辑。 ```python import torch # 示例:将张量转换为 float 类型以避免类型不匹配 tensor = torch.tensor([1.0], dtype=torch.half) tensor = tensor.to(torch.float) # 转换为 float 类型 ``` #### 2. 对象或变量重复定义错误 当代码中存在同名的对象或变量定义时,可能会引发 `RuntimeError: Internal: is already defined` 错误。这种问题通常出现在模块导入或全局作用域中[^2]。 **解决方案**: - 检查代码中是否存在重复定义的对象或变量。 - 使用不同的命名规则来区分不同作用域中的对象或变量。 - 确保模块导入路径清晰,避免命名冲突。 ```python # 示例:避免重复定义变量 x = 10 # 不要再次定义 x,改为使用其他名称 y = 20 ``` #### 3. 内存管理问题 Python 在运行时可能会遇到内存不足的问题,尤其是在处理大规模数据或递归调用时。这种情况下,程序可能会抛出 `MemoryError` 或其他运行时错误。 **解决方案**: - 优化代码逻辑,减少不必要的内存占用。 - 使用生成器或迭代器代替一次性加载所有数据。 - 增加系统可用内存或优化硬件配置。 ```python # 示例:使用生成器减少内存占用 def generate_numbers(): for i in range(1000000): yield i for num in generate_numbers(): print(num) ``` #### 4. 非法操作错误 某些操作可能在特定条件下是非法的,例如除以零或访问未初始化的变量。这些操作会导致运行时错误。 **解决方案**: - 在执行操作前检查条件是否合法。 - 使用异常处理机制捕获并处理潜在的错误。 ```python # 示例:避免除以零错误 try: result = 10 / 0 except ZeroDivisionError: print("除数不能为零") ``` ### 总结 运行时错误通常是由于代码逻辑、数据类型或外部资源问题引起的。通过仔细检查代码、优化逻辑以及使用适当的异常处理机制,可以有效解决这些问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值