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

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

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

5222 次点击
所在节点    程序员
39 条回复
tulongtou
2022-04-05 01:44:43 +08:00
这两门语言你都熟悉,为什么还需要问网友呢
rv54ntjwfm3ug8
2022-04-05 01:45:53 +08:00
@tulongtou #1 “比较熟悉”只是会用,不确定哪个在这种场景下性能高
ZRS
2022-04-05 01:48:07 +08:00
瓶颈应该在网络 IO ,用啥语言问题都不大
3dwelcome
2022-04-05 01:48:18 +08:00
我扫描过所有 ipv4 段的 80 端口服务,并发上限和开多少线程关系不大。

影响 tcp 连接速度,主要因素是 DNS 的解析,TCP 的三次握手的等待时间。

TCP 有非阻塞模式,设置 fcntl(sock, F_SETFL, O_NONBLOCK);管他服务器什么时候响应,先把 IP 包发出去再说,并发就上去了。
fishCatcher
2022-04-05 01:48:24 +08:00
go 协程应该恰好满足你的需求,不知道 python 和 c#实现的如何。
或者固定一个 io 线程,剩下几个线程处理数据
macrorules
2022-04-05 01:48:43 +08:00
C# + 宇宙第一 IDE 横扫一切
Richard14
2022-04-05 01:50:40 +08:00
需求比较简单,哪个语言都无所谓。Python 的话,首先你需要调高系统允许最大 socket 连接数,创建 asyncio 线程,每个线程可以并发 1-10k 的访问,然后再将这个线程用 multiprocessing 重复。瓶颈只在于系统 IO ,与应用层实现关系不大
vance123
2022-04-05 01:59:28 +08:00
虽然没有并发限制,但服务器带宽还是有限的。假设每个文件 100k ,服务器带宽 100m ,每秒也就 1000 个文件
mxT52CRuqR6o5
2022-04-05 04:57:25 +08:00
@theklf4 你这个是 io 密集的需求,语言本身不会成为性能瓶颈
documentzhangx66
2022-04-05 06:14:47 +08:00
1.容易实现:Python ,原因是可直接白嫖的工具包,比 C#多的多。

2.性能,也就是运行速度:不一定。虽然 C#性能比 Python 高得多,但 Python 可以直接调 C 库加持。

3.稳定性:如果是公司要做正经的工程,并且是多人合作,那么 C#肯定比 Python 好。原因是 Python 语言缺少健壮性的支持,但这不是 Python 的错,胶水语言,比如 js ,都有这类问题。稳健需要强类型+强异常型语言。

4.如果这需求,是我一个人来做,我会这样:

先用 Python 做,但需要把功能分为不同模块。而且实现方法不能用 Python 的原生写法,而需要使用 Java 那一套工程化的结构模式。

然后性能测试,哪个模块是性能瓶颈,用 C 库解决。如果是多人协作,甚至可以用 Redis 当中间库,Python 采集一手数据丢 Redis ,Cpp 从 Redis 拉取数据进行分析处理,并且 URL 的去重也用 Cpp 中间件做。
Mutoo
2022-04-05 08:12:49 +08:00
Python 有开源的 scrapy 你要的需求都有了,直接用不香吗。
opengps
2022-04-05 09:11:02 +08:00
当然是你怎么熟悉怎么来。
如果你同时是两门语言的顶尖高手,那么你才有必要去在乎采用哪门语言更高效
keepeye
2022-04-05 09:57:58 +08:00
python 有现成的 scrapy 爬虫框架,不想用可以自己用 aiohttp + asyncio.Queue
ragnaroks
2022-04-05 10:02:52 +08:00
如果你的环境是 windows 的话,dotnet 性能更好,默认情况下就是并行完成端口
yolee599
2022-04-05 10:04:12 +08:00
用 C# 比较好
ychost
2022-04-05 10:18:44 +08:00
爬虫 py 比较合适
ly841000
2022-04-05 11:39:45 +08:00
@documentzhangx66 .......按你这说法,必须 c#啊,c#性能本身就比 python 高一个数量级,还可以直接调用任何 api, c 库。。。python 还要封装,哪个更方便还要说?
idragonet
2022-04-05 12:13:49 +08:00
C#做过爬虫挺好的,不过是抓取几万个网页而已。
seakingii
2022-04-05 12:47:12 +08:00
安全吗,注意法律问题....
两都都可以实现任务,不过考虑到数量级,尽量用性能高一点的语言吧,所以推荐用 c#而不是 python
ch2
2022-04-05 13:03:34 +08:00
这两个都能胜任,最大的瓶颈是你的网卡有多少带宽以及对面网站会给你一个 ip 分多少带宽

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

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

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

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

© 2021 V2EX