进程与线程的区别 附加爬取喜马拉雅有声书代码

1.什么是线程?
线程是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

2.什么是进程?
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。里面包含对各种资源的调用,内存的管理,网络接口的调用等。。。对各种资源管理的集合 就可以称为 进程
3.线程和进程的区别
(1)线程共享内存空间;进程的内存是独立的
(2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现
(3)创建新线程很简单; 创建新进程需要对其父进程进行一次克隆
(4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程
(5)改变主线程(如优先权),可能会影响其它线程;改变父进程,不影响子进程

from lxml import etree
import requests
from urllib import parse


def page_download(url_href):
    trace_id = url_href.split('/')[-1]
    url = 'https://www.ximalaya.com/revision/play/tracks?trackIds='+str(trace_id)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
    }
    response = requests.get(url, headers=headers)
    json_dict = response.json()
    src_str = json_dict['data']['tracksForAudioPlay'][0]['src']
    trackName = json_dict['data']['tracksForAudioPlay'][0]['trackName']
    from urllib import request
    request.urlretrieve(src_str, 'yishuochunqiu/'+trackName + '.m4a')
    print(src_str,trackName)
def get_url(queue):
    for i in range(1,22):
        url_base = 'https://www.ximalaya.com/lishi/4164479/p%s/'%i
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
        }
        response = requests.get(url_base, headers=headers)
        html_str = response.text
    # with open('yishuo.html', 'wb') as f:
    #     f.write(response.content)
        html_ele = etree.HTML(html_str)

        href_list = html_ele.xpath('//ul[@class="dOi2"]/li/div[2]/a/@href')

        for href in href_list:
            detail_url = parse.urljoin(url_base, href)
            # page_download(detail_url)
            queue.put(detail_url)

if __name__ == '__main__':
    from multiprocessing import Process,Queue,Pool
    q = Queue()
    p = Process(target=get_url,args=(q,))
    p.start()
    download_pool = Pool(5)
    for m in range(1,20):
        mp3_url = q.get()
        download_pool.apply_async(page_download,args=(mp3_url,))
    download_pool.close()
    download_pool.join()
    p.join()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值