场景是从一个 URL 获取数百万个任务(每次最多获取 1 万条任务,可自定义数量,但不能从中间开始获取,且每 2 秒只能请求一次任务列表),每个任务中的 URL 分别请求(访问每个 URL 需要 0.1~30+ 秒,目标网站没有并发限制),解析出需要的数据后上报需要的数据和任务 ID 到同一 URL (一次可以上报多个任务的结果)。因为不可能同时发几百万个请求,所以应该要用到线程池,设置最高同时多少任务在运行。请问这种场景的最佳实践是什么,C#还是 Python (我比较熟悉这两门语言)速度快且容易实现?
1
DonaidTrump 2022 年 4 月 5 日 via iPhone
这两门语言你都熟悉,为什么还需要问网友呢
|
2
rv54ntjwfm3ug8 OP @tulongtou #1 “比较熟悉”只是会用,不确定哪个在这种场景下性能高
|
3
ZRS 2022 年 4 月 5 日 瓶颈应该在网络 IO ,用啥语言问题都不大
|
4
3dwelcome 2022 年 4 月 5 日 我扫描过所有 ipv4 段的 80 端口服务,并发上限和开多少线程关系不大。
影响 tcp 连接速度,主要因素是 DNS 的解析,TCP 的三次握手的等待时间。 TCP 有非阻塞模式,设置 fcntl(sock, F_SETFL, O_NONBLOCK);管他服务器什么时候响应,先把 IP 包发出去再说,并发就上去了。 |
5
fishCatcher 2022 年 4 月 5 日 via iPhone
go 协程应该恰好满足你的需求,不知道 python 和 c#实现的如何。
或者固定一个 io 线程,剩下几个线程处理数据 |
6
macrorules 2022 年 4 月 5 日
C# + 宇宙第一 IDE 横扫一切
|
7
Richard14 2022 年 4 月 5 日 需求比较简单,哪个语言都无所谓。Python 的话,首先你需要调高系统允许最大 socket 连接数,创建 asyncio 线程,每个线程可以并发 1-10k 的访问,然后再将这个线程用 multiprocessing 重复。瓶颈只在于系统 IO ,与应用层实现关系不大
|
8
vance123 2022 年 4 月 5 日 via Android
虽然没有并发限制,但服务器带宽还是有限的。假设每个文件 100k ,服务器带宽 100m ,每秒也就 1000 个文件
|
9
mxT52CRuqR6o5 2022 年 4 月 5 日 via Android
@theklf4 你这个是 io 密集的需求,语言本身不会成为性能瓶颈
|
10
documentzhangx66 2022 年 4 月 5 日
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 中间件做。 |
11
Mutoo 2022 年 4 月 5 日
Python 有开源的 scrapy 你要的需求都有了,直接用不香吗。
|
12
opengps 2022 年 4 月 5 日
当然是你怎么熟悉怎么来。
如果你同时是两门语言的顶尖高手,那么你才有必要去在乎采用哪门语言更高效 |
13
keepeye 2022 年 4 月 5 日
python 有现成的 scrapy 爬虫框架,不想用可以自己用 aiohttp + asyncio.Queue
|
14
ragnaroks 2022 年 4 月 5 日
如果你的环境是 windows 的话,dotnet 性能更好,默认情况下就是并行完成端口
|
15
yolee599 2022 年 4 月 5 日 via Android
用 C# 比较好
|
16
ychost 2022 年 4 月 5 日
爬虫 py 比较合适
|
17
ly841000 2022 年 4 月 5 日 @documentzhangx66 .......按你这说法,必须 c#啊,c#性能本身就比 python 高一个数量级,还可以直接调用任何 api, c 库。。。python 还要封装,哪个更方便还要说?
|
18
idragonet 2022 年 4 月 5 日
C#做过爬虫挺好的,不过是抓取几万个网页而已。
|
19
seakingii 2022 年 4 月 5 日
安全吗,注意法律问题....
两都都可以实现任务,不过考虑到数量级,尽量用性能高一点的语言吧,所以推荐用 c#而不是 python |
20
ch2 2022 年 4 月 5 日
这两个都能胜任,最大的瓶颈是你的网卡有多少带宽以及对面网站会给你一个 ip 分多少带宽
|
21
Dockerfile 2022 年 4 月 5 日
@ly841000 肯定是 python 方便,就发网络请求调什么 c 库,没麻烦找麻烦么
|
23
wzzzx 2022 年 4 月 5 日
大部分的业务场景,语言都不是瓶颈
|
24
iyaozhen 2022 年 4 月 5 日
都行,不是瓶颈。Python 性能差不是在 IO 上差
|
25
Dockerfile 2022 年 4 月 5 日
@ly841000 你自己说的 c 库啊。。
|
26
fanxiao 2022 年 4 月 5 日
c# async await 模式,挺适合这种 IO 密集型任务
|
27
wangritian 2022 年 4 月 5 日
语言不重要,协程模型是关键,最适合这件事的我觉得是 go
|
28
westoy 2022 年 4 月 5 日
|
29
em70 2022 年 4 月 5 日
哪个你写代码快用哪个
|
30
Yunen 2022 年 4 月 5 日
首选 golang
|
31
ClericPy 2022 年 4 月 5 日
Python 请求几百万不是大量级, 带宽足够的情况下, aiohttp + uvloop 大约一小时以内就能搞定(之前爬 fb 380 万页请求开个多核加协程 50 分钟就抓完了), 如果是线程的话并发高了切换开销太大真不如协程, 性能损耗太大了. C# 不了解, 不过也算协程友好的, 熟悉哪个用哪个吧
|
32
IvanLi127 2022 年 4 月 5 日 via Android
我选 C#。
|
33
ration 2022 年 4 月 6 日 via Android
爬虫 python 的库多
|
34
ElmerZhang 2022 年 4 月 6 日
我可能会选择写一段 shell
|
35
Ackvincent 2022 年 4 月 6 日
这不就是 python 的活嘛
|
36
bthulu 2022 年 4 月 6 日
要个屁的线程池啊, 单线程高宽带就行了. 把你这数百万个任务写到一个文件里, 然后直接下载这个文件就好了
|
37
rv54ntjwfm3ug8 OP @bthulu #36 有的 URL 不到 0.1 秒就请求完了,有的 URL 要等 10 分钟超时,显然爬的不可能是我的网站,有几个万个不同的网站
|
39
beyondex 2022 年 4 月 6 日
当然是 C# 在并发、任务调度这块,官方、三方都用很好用的库
|