JS async không chạy thực sự song song?

em test loop 100 request đến 1 api sử dụng fetch , delay mỗi request là 0.5s.
trung bình thì 1 request hoàn thành trong khoảng 2-3s thôi. nhưng khi xem network thì thấy càng về các rq sau thì thời gian done càng lâu, vậy js async không thực sự chạy song song mà thời gian hoàn thành 1 rq nó vẫn bị ảnh hưởng bởi các rq khác à mn.?

với cả khi rq số lượng lớn hơn (khoảng 10000 chẳng hạn), thì được 1 lúc nó sẽ hay bị lỗi Failed to Fetch, e xem network thì không có thông báo lỗi rõ ràng nào cả. e nghĩ có thể do rq quá nhanh với số lượng lớn. code e chạy local sử dụng Wampp để tạo apache webserver, php 7.4, fetch api . Lỗi này liệu có liên quan đến cấu hình apache hay php ko nhỉ mn? Ví dụ như rq quá nhanh nên server quá tải, timeout…

So sánh với python em sử dụng multithreading và requests thì hiệu suất hơn rất nhiều. em chạy 100 thread rq đến api kia thì chỉ cần 3s là xong 100 rq. JS thì chắc mất đến cả phút thậm chí hơn nữa.

Có phải Do python chạy trực tiếp trên cmd, tận dụng ngay phần cứng của máy, còn JS thì cần chạy trên trình duyệt để rq đến api viết bằng php, php lại phải chạy thông qua apache server tạo từ phần mềm Wampp nên nó chậm chăng? Có cách nào để JS async đạt đc hiệu suất như khi sử dụng multithreading trong python ko mn?

VIDEO đây ạ: https://streamable.com/sc0cyb

max-browser-parallel-connection

Vậy thì bạn cho cả 2 đều chạy trên CMD nhé

3 Likes

mớ thông tin bạn đưa ra không thật sự nói lên được gì cả
file php đó bạn xử lý cái gì? cấu hình web server như thế nào? ví dụ time 10s đó cơ cấu thành phần ra sao?

đoạn này mình hiểu là bạn đang so sánh performance của client khi viết bằng python với js trên trình môi trường trình duyệt

đọc tới đây, bạn đặt vấn đề apache/php chậm, python nhanh?
vậy bạn đang so sánh cái gì với cái gì? python (backend/server) vs apache/php?

bài viết lang mang quá.

5 Likes

vậy em chạy trên chrome thì chỉ chạy đc song song 6 connection thôi à a.

js thuần thì chạy cmd kiểu j a nhỉ.? e đang chạy dạng web dùng html,css,js , backend là php

file php đó có thể là bất cứ gì, ở đây là e xử lý 1 vài logic thôi. nếu chạy file php này trên trình duyệt qua url hoặc chạy cmd qua curl(php), request (python) thì nó chỉ mất tầm 3s là xong.

em đang so sánh giữa async trong js và multithreading trong python đó a.

nếu request số lượng lớn đến file php này thì như e nói ví dụ 100 lần thì dùng js async tốn rất nhiều thời gian để chạy xong 100 request ,giống như ảnh #1, request thứ 13 mất đến 16.31s, request thứ 100 chắc phải mất vài phút (giả sử ko có delay, 100 request chạy song song ngay lập tức),

for(let i = 0; i < 100; i++){

    fetch("URL.php", {

        method: "GET",

    }).then(res =>{

        //

    })

}

còn python e tạo 100 thread => vì mỗi request đến url kia chỉ mất tầm 3s để done, nên python cũng chỉ mất khoảng 3s để xong 100 request

import threading

import requests

def test():

    requests.get('URL.php')

thread_count = 100

for i in range(thread_count):

    t = threading.Thread(target=test, args=())

    t.start()

python: tạo 1 file .py rồi chạy thẳng trên cmd

js: e tạo 1 file index.html, viết js request = fetch api . sau đó chạy trên trình duyệt chrome localhost/index.html, file php cũng đặt trên localhost/url.php
localhost e cài bằng phần mềm wampp. server apache, php 7.4

đầu tiên là mình có chút góp ý về câu từ, như cái đề bài bạn đưa ra viết không rõ ràng, mình phải hỏi thêm 1 lần thì bạn mới giải thích và lúc này vấn đề mới rõ ràng hơn

bạn đang so sánh performance khi gọi nhiều http request giữa 2 clients
từ js fetch chạy trên trình duyệt
từ python requests

mình thắc mắc, bạn đo thời gian như thế nào? bạn có thể gắn đầy đủ log vào để thể hiện được thời gian từ lúc bắt đầu gọi đến lúc kết thúc của mỗi request không?
cả 2 đoạn code js và python luôn
còn viết như trên thì không có gì để xác minh cả

3 Likes

Vì JS bạn chạy trên browser nên bị browser giới hạn còn gì.
JS standalone chỉ có Node.js nổi nhất.

1 Like

hic sr vì e ns hơi khó hiểu. e up video ở #1 đó a có thể xem ah.

còn nguyên nhân gì nữa ko ạ. hic em cần viết thành web chạy trên trình duyệt để thao tác dễ hơn, và chạy trên nhiều thiết bị, chỉ cần có trình duyệt là đc. mà hiệu suất nó kém quá.

Cấu hình lại domain thì có thể tạm “chữa cháy” cũng được 6 request mỗi subdomain, ko cần set cứng chỉ cần wildcard thôi.

giờ e mới biết vụ trình duyệt giới hạn cái này đó. còn cách nào chạy được song song ko giới hạn ko a. chứ 6 conn mỗi host thì ít quá. nếu k thì chắc viết dưới dạng web chạy trên trình duyệt ko phục vụ đc nhu cầu rồi.

đầu tiên, chúc mừng bạn, vì bạn đã show đủ thông tin cho vấn đề
tiếp theo là mình xin giải thích một chút như sau

  1. javascript, thì bản chất của nó chỉ có 1 thread, đối với các tác vụ cần IO resource, js sẽ gọi đi các api bên lớp dưới và listen event phản hồi, chứ bản chất js không tự thực hiện các hành động đó, cụ thể hơn trong case là gọi http
    Như vậy, khi bạn gọi nhiều fetch cùng lúc, js vẫn sẽ bảo “ok, kêu thì gửi thôi, còn chừng nào xong thì… không biết à nha”, và js gọi đến xuống lớp “api” (api ở đây là lớp xử lý các lệnh IO phía sâu bên dưới js engine, không phải http api)
    khi nào lớp dưới xong thì lại send event về cho js, để trong quá trình chờ đó, js vẫn có thể làm được những việc khác
    như vậy, đây không phải vấn đề ngôn ngữ


ví dụ trên máy tính của mình, lớp trình duyệt có thể start được 6 http connection cùng 1 thời điểm
tổng cộng 100 request, mất hết 17 đợt (giống như 1 chuyến đò chở được 6 người, 100 người phải chia ra tới 17 chuyến), tổng cộng mất 51s
việc mỗi lần có thể handle bao nhiêu connection/request thì có lẽ còn tùy thuộc vào phần cứng, hệ điều hành và cấu hình các thứ nữa
trong video của bạn có vẻ như mỗi lần chỉ được có 1 request

  1. python
    thì nó là tự python chia thread và handle request (mình không rõ cơ chế bên dưới của thư viện requests), bản thân tự control, chia thread để gọi, nên handle được nhiều connection hơn trong cùng thời điểm là bình thường

mình cũng không rõ về cấu hình của python, nhưng có thể là có giới hạn về số thread hoặc giới hạn về IO cũng như cấu hình (python), nên không phải muốn bao nhiêu thread cũng được

Cuối cùng, ngoài lề một chút, thường thì người ta cũng không test performance request trên client làm gì, vì cũng không ai gọi hàng trăm request như vậy cả, tất nhiên là người ta thích thì người ta code như vậy thôi, nhưng mà việc đó là không hợp lý
và khi bạn build web/app hay product gì đó, thứ mà bạn không control được là client, người ta có thể xài con máy tính đời tổng, hay i9 hay mac pro siêu cấp, bạn không thể control được, nên test và chém gió cho vui chứ không nhiều ý nghĩa đâu

4 Likes

hehe tuỳ nhu cầu công việc với chủ yếu chạy nội bộ thôi ạ. hiện tại thì code python đang chạy rất tốt rồi a. muốn dựng lên web để cho nv thao tác dễ hơn chút mà dùng js gặp vấn đề này nên e mới hỏi.
nói chung như mn nói thì là do giới hạn của trình duyệt, liệu có giải pháp nào ko nhỉ a, e search thử thấy bảo http/2 thì ko bị trình duyệt limit concurrent http request như http/1.1 ko biết có đúng k. e đang tìm cách enable http2 trên localhost

bạn có ngữ cảnh cụ thể không? ví dụ bạn cần làm gì mà lại phải gọi nhiều api cùng lúc như vậy?
phải có vấn đề cụ thể thì mới có giải pháp
còn đặt ra vấn đề một cách vu vơ như vậy thì cũng như bạn đang tìm cách để xe đạp chở được 5 tấn hàng như xe tải vậy đó, không có ý nghĩa gì cả => là sai ngay từ lúc đặt ra vấn đề

2 Likes

Ông anh này làm bên mảng MMO, đang định viết tool để làm auto-bot hoặc crawl web của người khác hoặc làm auto like Facebook, tăng view tiktok đấy mọi người ạ. Nên cần benchmark để tối ưu chi phí thuê VPS thôi.

Thật ra không có web nhân viên nào ở đây cả, tập đoàn nào mà có nhân viên dùng web còn hơn ddos, nhân viên chắc toàn tricker :v

việc thì ko nói cụ thể được là gì a, nói chung là việc cần đến lượng request cực lớn để hoàn thành nhanh vì số lượng KH cần mỗi ngày rất lớn.
như e nói hiện tại e chạy = python đang khá ổn định rồi. nhưng nó dùng cmd lấy đơn r tự chạy treo 24/24. e làm thêm bản web để thao tác tay (ví dụ như python chạy có đơn nào lỗi, gửi đơn đó về database, k muốn dừng cmd thì sẽ chạy lại đơn = tay trên trình duyệt dễ dàng hơn), và còn thêm 1 vài tính năgn khác nữa mà phải sử dụng trên web, và có thể thương mại bản web này về sau nếu muốn. sau thread này em biết thêm vài thứ, chắc điều này ko khả thi rồi

k liên quan đến chi phí, vps cùi thì ko đáp ứng đc việc mình đang làm. mh thuê dedicated vps bên ovh lúc nào cũng sẵn để treo tool python r, vấn đề là muốn viết sang dạng web chạy JS mà đang k đáp ứng đc hiệu suất như mong đợi thôii b.

mh có nói là tập đoàn nào đâu, team nhỏ có vài người mình lead thôi.

Vấn đề ở đây là bạn chân đi hai hàng: vừa muốn làm tư bản kiếm tiền lại vừa muốn chỉ học hành làng nhàng cũng có thể làm được. Chọn 1 trong 2 thôi, không thì dính technical debt đến bạc đầu :smiley:

Bạn dùng Python chạy được rồi thì tại sao bạn lại không biết rằng bạn có thể làm web front-end (thực ra nó cũng back-end luôn nhưng output được ra giao diện web để tương tác chuột thay vì gõ lệnh - là việc rất bình thường hiện nay các web động/ web app đều làm - và Python cũng đang có các web framework rất tốt để làm) để gọi đến Python bên dưới / đằng sau? Nếu biết mà không làm thì nên gọi là gì? Cứng đầu chăng? Khi có web front-end rồi thì click chuột kiểu gì mà không được, sao bạn cứ muốn JS chạy trực tiếp thay Python? Có lẽ là khả năng lập luận của bạn nhầm nhọt giữa async với lại hiệu suất cao/ chạy nhiều luồng, hoàn toàn nhầm. Hoặc có tồn tại khả năng bạn đang lấp liếm vấn đề là bạn copy đâu đó những đoạn code Python mà bạn hoàn toàn không hiểu code làm gì/ hiểu rất sơ đẳng nên cảm thấy bị vướng. Trong khi đó JS thì có những đoạn code như vậy để bạn copy dùng ngay nhưng nó lại không nhanh, mạnh như Python. Nên giờ định lên đây nhờ ai đó có kinh nghiệm giải quyết việc này để có thể dùng JS chăng? Anh em ở đây chủ yếu là phân tích vấn đề theo kiểu học hành. Còn MMO thì nên qua bên diễn đàn MMO để họ có cách giải quyết, còn ở đây, một lát chẳng ai chơi với bạn vì lạc tông. Giải pháp thích hợp: làm theo kiểu dân MMO (đặt ra yêu cầu và thuê người đủ trình giải quyết vấn đề giúp) hoặc nếu muốn học hành thì bỏ MMO qua một bên, học cho giỏi lên rồi quay lại MMO sau. Đi hai hàng như hiện tại hôm nào sẽ phải đi thay khớp háng. Mình nhớ có topic bạn trước đây, bạn có bật mí rằng bạn kiếm cả trăm triệu đến tỉ đồng/ tháng, mấy việc này cần chi tiền để thuê người đủ trình giúp bạn, hoặc thuê gia sư kèm tại chỗ cho bạn nếu bạn muốn hiểu và tự làm, bạn lại không chịu chi tiền để giải quyết? Thật khó hiểu.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?