Thoạt nhìn, xử lý song song nghe có vẻ như một lời mời ăn trưa miễn phí - có thể sử dụng CPU đa lõi hiệu quả hơn nên cung cấp mã của bạn một lần tăng tốc độ rất lớn. Kinh nghiệm thực tế cho thấy rằng đây không phải lúc nào luôn là trường hợp: một số vấn đề là không thể song song. Ngoài ra, thực thi song song dẫn đến cả một gia đình có vấn đề mới không được nhìn thấy trên các máy lõi đơn.
Về nguyên tắc mã song song có thể được chia thành hai nhóm công việc. Nhóm đầu tiên là tăng tốc độ cổ điển - nếu chương trình của bạn phải sàng lọc 3000 hình ảnh, hãy chia công việc có nghĩa là nhiều hình ảnh có thể được xử lý bất cứ lúc nào. Trong khi chắc chắn có lợi, loại nhiệm vụ này hiếm khi gặp phải trong phát triển web hàng ngày. (Nếu bạn đang tạo một trang web nặng hình ảnh, hãy chắc chắn rằng bạn đã sao lưu chúng với đàng hoàng lưu trữ đám mây ).
Hình thức phổ biến hơn của công việc hoàn hảo hoạt động xung quanh các nhiệm vụ dài hạn không yêu cầu nhiều thời gian CPU. Một ví dụ điển hình cho việc này sẽ đang chờ tải xuống hoặc một loại đầu vào thiết bị: Nếu điều này được thực hiện theo một cách song song, phần còn lại của GUI không cần phải bị chặn. Cho rằng người dùng có xu hướng có vấn đề hiểu 'Tại sao nút không nhấp vào', điều này có thể dẫn đến tăng sự hài lòng của người dùng ngay cả khi tốc độ thực tế không tăng.
Nếu bạn cần một số tài nguyên mới để giúp bạn mã thông minh hơn, hãy xem hướng dẫn của chúng tôi về tốt nhất Công cụ thiết kế web của năm 2019. Nếu bạn muốn tránh mã hoàn toàn, hãy thiết kế trang web của bạn tốt nhất người tạo ra trang web và đảm bảo bạn đã chọn hoàn hảo web hosting dịch vụ với hướng dẫn của chúng tôi.
var ngủ = yêu cầu ('ngủ');
Hàm nhân viên () {
Console.log ("Worker Up")
SLEEP.MSLEP (1000)
Console.log ("Công nhân xuống")
Không thể
setInterval (công nhân, 2000);
trong khi (1 == 1)
Đồn là
SLEEP.MSLEP (250)
Console.log ("Xin chào từ chính")
} & gt;
Hãy để chúng tôi bắt đầu với một ví dụ nhỏ dựa trên một yêu thích được yêu thích tốt: setInterval. chức năng. Nó cần một tài liệu tham khảo chức năng và một giá trị số được phân định trong mili giây. Sau đó, chức năng được kích hoạt định kỳ bất cứ khi nào hẹn giờ chậm trễ hết hạn.
NPM cài đặt ngủ
npm example1.js
Sử dụng ngủ() Chức năng yêu cầu chúng tôi tải mô-đun ngủ vào một dự án NPM địa phương. Nó hoạt động như một giao diện cho thư viện giấc ngủ của hệ điều hành - đừng tự hỏi nếu trình biên dịch của máy trạm của bạn bị sa thải trong quá trình triển khai gói.
Khi chạy chương trình này, bạn sẽ thấy mình phải đối mặt với đầu ra tương tự như trong hình được hiển thị trong hình đi kèm với bước này. Rõ ràng là công nhân của chúng tôi không bao giờ được gọi - một cái gì đó phải sai với chức năng setInterval.
Các trình duyệt hiện đại Trang bị cho mỗi tab với một luồng JavaScript. Một cái nhìn cẩn thận về vòng lặp của chúng tôi tiết lộ rằng nó là vô tận. Điều này có nghĩa là nó sẽ chạy mãi mãi, và sẽ không bao giờ mang lại quyền kiểm soát. Cho rằng setInterval () Hoạt động với một thông báo, tải trọng của nó không bao giờ chạy vì trình xử lý tin nhắn bị chặn chạy.
Const Bar = () = & GT; Console.log ('bar')
const baz = () = & gt; Console.log ('Baz')
const foo = () = & gt; Đồn là
Console.log ('foo')
SETIMEUT (thanh, 0)
Baz ()
Không thể
foo ()
Flavio Copes 'Blog , cung cấp một chút mã cực kỳ thú vị minh họa vấn đề. Khi chạy, nó mang lại đầu ra được hiển thị trong hình do hàng đợi tin nhắn bị chặn cho đến khi foo () từ bỏ kiểm soát các chủ đề chính.
Cho rằng hệ điều hành cơ bản có thể thực hiện đa nhiệm ưu tiên, hãy để chúng tôi khai thác khả năng của nó bằng cách nhổ các luồng thông qua một API chuyên dụng có tên là WebWorkers, được hỗ trợ rộng rãi. Con số đi kèm với bước này cho thấy Danh sách hiện tại cho tính năng.
Console.log ("Công nhân nói xin chào!");
Console.log ("Worker Up");
trong khi (1 == 1)
Đồn là
Console.log ("x");
Không thể
WebWorkers không thể khởi động với một tải trọng chức năng. Thay vào đó, một tệp mới là bắt buộc chứa mã dự định chạy trong chuỗi. Trong trường hợp ví dụ của chúng tôi, example7thread.js. Có nội dung được hiển thị kèm theo bước này.
Const Worker = yêu cầu ('worker_threads');
var MyWorker = Worker mới.Worker ('./
example7thread.js ');
var MyWorker2 = Công nhân mới. Người làm việc ('./
example7thread.js ');
Công nhân của chúng tôi đã sẵn sàng cho thời gian chính. Đặc sản của Node.js Thời gian chạy bắt buộc chúng tôi bao gồm mô-đun chủ đề công nhân và truyền trong một đường dẫn tương đối - các vấn đề không phải đối mặt trong trình duyệt. Hơn nữa, đừng tự hỏi về Thiếu bắt đầu () Gọi - một công nhân web đặt ra khi trường hợp xuất hiện trực tuyến.
Giao hàng tin nhắn thường yêu cầu một số loại tương tác giữa thời gian chạy và phần còn lại của hệ điều hành. Đáng buồn thay, vòng lặp vô tận của chúng tôi chặn quá trình này - điều đó có nghĩa là chỉ có một trong số các tin nhắn bật lên trước '"gian hàng lớn".
Const Worker = yêu cầu ('worker_threads');
var MyWorker = Worker mới.Worker ('./
example7thread.js ');
var MyWorker2 = Công nhân mới. Người làm việc ('./
example7thread.js ');
trong khi (1 == 1)
Đồn là
Không thể
Một thí nghiệm khác liên quan đến việc đặt một vòng trống sau hai lệnh xây dựng. Trong trường hợp này, các luồng sẽ không bao giờ bắt đầu hoạt động - thông điệp gọi không bao giờ đến với hệ điều hành.
Trong khi công nhân chạy những vòng lặp vô tận chặt chẽ có những vấn đề được trưng bày ở trên, các thói quen có thể giao tiếp với nhau. Điều này được thực hiện thông qua một giao diện truyền thông báo - Hãy nghĩ về nó như một cơ sở cho phép bạn chuyển một đối tượng tin nhắn từ người gửi đến người nhận trên các ranh giới chủ đề.
Ngoài những lợi ích của việc có thể phối hợp các chủ đề E FF Iciently (và giảm nguy cơ 'va chạm', còn được gọi là điều kiện chủng tộc), thông điệp chuyển sang chủ đề chính là cách duy nhất để tương tác với DOM, do di ff lo lắng tạo ra Ngăn xếp GUI an toàn chủ đề.
Triển khai thông báo đi qua trong Node.js là tẻ nhạt. Di chuyển mã vào web - Bắt đầu bằng cách tạo dây nịt HTML tải examplempi.js. . Xin lưu ý rằng mã này chỉ có thể được chạy từ một máy chủ web localhost do các hạn chế xuất xứ DOM.
var MyWorker = Công nhân mới ('./
exerplempithread.js ');
var MyWorker2 = Công nhân mới ('./
exerplempithread.js ');
MyWorker.onMessage = Chức năng (e)
Đồn là
Console.log (e);
Không thể
MyWorker2.onMessage = Chức năng (e)
Đồn là
Console.log (e);
Không thể
Mỗi công nhân phơi bày một thuộc tính OnMessage chiếm một tham chiếu chức năng phải được gọi bất cứ khi nào một tin nhắn bật lên từ đầu kia. Tin nhắn đến được chuyển sang được chuyển tiếp đến bảng điều khiển của trình duyệt từ luồng chính.
PostMessage ("Công nhân nói xin chào!");
postmessage ("công nhân lên");
trong khi (1 == 1)
Đồn là
postmessage ("x");
Không thể
Gửi tin nhắn đến hộp thư được thực hiện bằng cách gọi chức năng Tin nhắn POST. Hãy nhớ rằng một công nhân cũng có thể thực hiện một onmessage. sự kiện, có thể nhận được thông tin từ bất cứ ai sở hữu 'đối tượng cá thể công nhân.
Tại thời điểm này, mã đã sẵn sàng để chạy. Bảng điều khiển dành cho nhà phát triển không bị ngập lụt với các tin nhắn do tính I FF cao của giao diện MPI, có nghĩa là dữ liệu có thể di chuyển xung quanh hệ thống e ff iCiently.
Việc Microsoft bổ sung các từ khóa Async và chờ đợi đã sửa đổi lịch sử của C # và VisualBasic.net. Về nguyên tắc, một phương thức được đánh dấu Async đang chạy hợp tác với phần còn lại của chương trình. Kết quả sau đó có thể được thu hoạch thông qua chức năng đang chờ.
Const ngủ = (mili giây) = & gt; Đồn là
Trả lại lời hứa mới (giải quyết = & gt;
setTimeout (giải quyết, mili giây))
}
Cho rằng các trình duyệt nằm trong những hạn chế nghiêm trọng khi nói đến việc truy cập các chức năng gốc, chúng ta không thể sử dụng lại chức năng ngủ được đề cập trước đó. Nó, hơn nữa, là dưới mức tối ưu ở chỗ nó dừng toàn bộ thời gian chạy Node.js. Đoạn trích đi kèm với bước này cung cấp một cách tiếp cận hiệu quả hơn.
Mã này trả về một đối tượng Promise - Đây là một lớp tiện lợi khác được thêm vào tập lệnh Java trong một nỗ lực để thực hiện đa luồng dễ dàng hơn. Bạn sẽ cần phải gọi phương thức giải quyết của nó thông qua một Settimeout. , Đảm bảo rằng mã phải 'ngồi ngoài' khá nhiều thời gian.
Các cuộc gọi đang chờ chỉ được phép bên trong các hàm Async. Điều này có nghĩa là công nhân đang cần một bản viết lại - bắt đầu bằng cách gọi một hàm async mang. Nó xử lý phần còn lại của tương tác mã.
Const ngủ = (mili giây) = & gt; Đồn là
Trả lại lời hứa mới (giải quyết = & gt;
setTimeout (giải quyết, mili giây))
Không thể
PostMessage ("Công nhân nói xin chào!");
postmessage ("công nhân lên");
công nhân()
Công nhân chức năng Async () {
trong khi (1 == 1)
Đồn là
postmessage ("x");
đang chờ ngủ (1000);
Không thể
}
Các nhà phát triển làm việc trên mã Node.js không nên quên rằng họ có thể - thường - cũng tạo các mô-đun hoàn toàn bản địa nếu cần hiệu suất cực cao. Chúng không chỉ có thể tận dụng các API hệ điều hành khác nhau, mà còn có thể được viết bằng các ngôn ngữ lập trình biên dịch mã máy.
Bài viết này ban đầu được xuất bản trong số phát hành 291 của Tạp chí thiết kế web sáng tạo Nhà thiết kế web . Mua số 281. .
Đọc thêm:
[số 8] Các trang web hiện đại thường kết hợp tất cả JavaScript của họ thành một lần duy nhất, lớn ..
[số 8] Vài năm trước, giám đốc nghệ thuật của các trò chơi Lucid yêu cầu tôi giúp họ thiết kế 10 ch..
[số 8] Khi kết hợp các thiết kế và mô hình lặp lại vào một minh họa, một số công cụ sẽ hữu ích ..
Khi bạn đang vẽ nước gợn sóng với một cái gì đó trong đó, bạn đang đảm nhận nhiệm vụ vẽ một sự phản ánh bị gián đoạn. Điều này có thể l�..
[số 8] Tôi sẽ chia sẻ nhanh nhất Kỹ thuật vẽ tranh Tôi sử dụng cho 'gessoing' một bảng đi�..
[số 8] Nhà lãnh đạo hội thảo đỉnh đỉnh Glen Miền Nam. Chia sẻ các m�..
[số 8] Trang 1/2: trang 1 trang 1 Trang..
[số 8] Tay có lẽ là yếu tố giải phẫu khó khăn nhất để biết làm thế nào để sơn , th�..