请求数百万个 URL, C#还是 Python 快且容易实现?

2022-04-05 01:33:34 +08:00
 rv54ntjwfm3ug8

场景是从一个 URL 获取数百万个任务(每次最多获取 1 万条任务,可自定义数量,但不能从中间开始获取,且每 2 秒只能请求一次任务列表),每个任务中的 URL 分别请求(访问每个 URL 需要 0.1~30+ 秒,目标网站没有并发限制),解析出需要的数据后上报需要的数据和任务 ID 到同一 URL (一次可以上报多个任务的结果)。因为不可能同时发几百万个请求,所以应该要用到线程池,设置最高同时多少任务在运行。请问这种场景的最佳实践是什么,C#还是 Python (我比较熟悉这两门语言)速度快且容易实现?

5243 次点击
所在节点    程序员
39 条回复
Jwyt
2022-04-05 13:05:01 +08:00
@ly841000 肯定是 python 方便,就发网络请求调什么 c 库,没麻烦找麻烦么
ly841000
2022-04-05 13:41:16 +08:00
@Jwyt 说得 c#没我网络库似的。。。。
wzzzx
2022-04-05 14:06:58 +08:00
大部分的业务场景,语言都不是瓶颈
iyaozhen
2022-04-05 14:21:55 +08:00
都行,不是瓶颈。Python 性能差不是在 IO 上差
Jwyt
2022-04-05 14:35:52 +08:00
@ly841000 你自己说的 c 库啊。。
fanxiao
2022-04-05 16:18:34 +08:00
c# async await 模式,挺适合这种 IO 密集型任务
wangritian
2022-04-05 18:32:15 +08:00
语言不重要,协程模型是关键,最适合这件事的我觉得是 go
westoy
2022-04-05 18:37:58 +08:00
@Richard14

爬虫其实不需要多进程的,python 的 GIL 本来就不锁 IO, lxml 之类的配套基本也会释放 GIL 锁的......
em70
2022-04-05 18:47:23 +08:00
哪个你写代码快用哪个
Yunen
2022-04-05 19:22:52 +08:00
首选 golang
ClericPy
2022-04-05 19:57:37 +08:00
Python 请求几百万不是大量级, 带宽足够的情况下, aiohttp + uvloop 大约一小时以内就能搞定(之前爬 fb 380 万页请求开个多核加协程 50 分钟就抓完了), 如果是线程的话并发高了切换开销太大真不如协程, 性能损耗太大了. C# 不了解, 不过也算协程友好的, 熟悉哪个用哪个吧
IvanLi127
2022-04-05 22:53:02 +08:00
我选 C#。
ration
2022-04-06 00:46:41 +08:00
爬虫 python 的库多
ElmerZhang
2022-04-06 10:13:28 +08:00
我可能会选择写一段 shell
Ackvincent
2022-04-06 10:36:14 +08:00
这不就是 python 的活嘛
bthulu
2022-04-06 10:42:47 +08:00
要个屁的线程池啊, 单线程高宽带就行了. 把你这数百万个任务写到一个文件里, 然后直接下载这个文件就好了
rv54ntjwfm3ug8
2022-04-06 12:01:30 +08:00
@bthulu #36 有的 URL 不到 0.1 秒就请求完了,有的 URL 要等 10 分钟超时,显然爬的不可能是我的网站,有几个万个不同的网站
bthulu
2022-04-06 13:43:32 +08:00
@theklf4 那就走异步, C#的异步 httpclient 很好用
beyondex
2022-04-06 14:26:55 +08:00
当然是 C# 在并发、任务调度这块,官方、三方都用很好用的库

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844961

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX