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()