Tôi đã xem xét cách tôi có thể nhúng ngôn ngữ (hãy sử dụng Lua làm ví dụ) trong Erlang. Điều này tất nhiên không phải là một ý tưởng mới và có rất nhiều thư viện ở đó có thể làm điều này. Tuy nhiên tôi đã tự hỏi nếu nó có thể bắt đầu một Genserver với nhà nước được sửa đổi bởi Lua. Điều này có nghĩa là một khi bạn khởi động Genserver, nó sẽ bắt đầu quá trình Lua (chạy dài) để thao túng trạng thái của Genserver. Tôi biết điều này là có thể là tốt, nhưng tôi đã tự hỏi nếu tôi có thể đẻ trứng 1.000 10.000 hoặc thậm chí 100.000 của các quá trình này.Erlang sinh ra số lượng lớn các quy trình C
Tôi không thực sự quen thuộc với chủ đề này nhưng tôi đã thực hiện một số nghiên cứu. (Vui lòng sửa tôi nếu tôi sai về bất kỳ tùy chọn nào trong số này).
TLDR; Chuyển đến đoạn cuối cùng.
Đầu tiên lựa chọn: NIFs:
này không có vẻ như là một lựa chọn vì nó sẽ chặn các Erlang Scheduler của quá trình hiện hành. Nếu tôi muốn sinh ra một lượng lớn trong số này, nó sẽ đóng băng toàn bộ thời gian chạy.
Thứ hai tùy chọn: Port Driver:
Nó giống như một NIF nhưng giao tiếp bằng cách gửi dữ liệu đến một cổng nhất định, mà cũng có thể gửi dữ liệu trở lại Erlang. Điều này là tốt đẹp mặc dù điều này cũng có vẻ để ngăn chặn các Scheduler. Tôi đã thử một thư viện mà không các plat nồi hơi cho bạn là tốt, nhưng điều đó dường như để ngăn chặn các scheduler sau khi sinh ra 10 quy trình. Tôi cũng đã nhìn vào ví dụ postgresql trên Tài liệu Erlang được cho là không đồng bộ nhưng tôi không thể lấy mã ví dụ để làm việc (R13?). Thậm chí có thể chạy nhiều quy trình Port Driver mà không chặn thời gian chạy không?
tùy chọn thứ ba: C Nodes:
Tôi nghĩ đây là rất thú vị và muốn thử nó ra, nhưng dường như các dự án "erlang-lua" đã thực hiện điều này. Thật tuyệt vì nó sẽ không làm hỏng máy ảo Erlang của bạn nếu xảy ra sự cố và các quy trình được phân lập. Nhưng để thực sự sinh ra một quá trình duy nhất, bạn cần phải sinh ra toàn bộ một nút. Tôi không biết nó đắt đến mức nào. Tôi cũng không chắc chắn giới hạn của việc kết nối các nút trong một cluster là gì, nhưng tôi không thấy bản thân mình sinh ra 100.000 nút C.
Thứ tư lựa chọn: cổng:
Lúc đầu, tôi nghĩ rằng đây là giống như một điều khiển Cảng nhưng nó thực sự khác nhau. Bạn sinh ra một quá trình thực hiện một ứng dụng và giao tiếp thông qua STDIN và STDOUT. Điều này sẽ làm việc tốt cho sinh sản một số lượng lớn các quá trình, và (tôi nghĩ?) Họ không phải là một mối đe dọa cho máy ảo Erlang. Nhưng nếu tôi sẽ giao tiếp thông qua STDIN/STDOUT, tại sao ngay cả bận tâm với một ngôn ngữ nhúng để bắt đầu? Cũng có thể sử dụng bất kỳ ngôn ngữ kịch bản nào khác.
Và vì vậy sau nhiều nghiên cứu trong một lĩnh vực, tôi không quen thuộc với việc tôi đã đến đây. Bạn có thể một Genserver như là một "thực thể", nơi AI được viết bằng Lua. Đó là lý do tại sao tôi muốn có một quy trình cho từng thực thể. Câu hỏi của tôi là làm thế nào để tôi đạt được nhiều Genservers mà giao tiếp với các quá trình Lua chạy dài? Điều này thậm chí có thể? Tôi có nên giải quyết vấn đề của mình một cách khác nhau không?
Mã Lua có thực sự cần hoàn toàn vượt qua chuỗi hạt nhân cơ bản không? Hoặc nó có thể được thiết lập theo cách nó có thể đăng ký cho một cuộc gọi lại hoặc thông báo của một số loại để nó có thể mang lại các hạt nhân trở lại Erlang và sau đó được gọi trở lại khi sự kiện nó quan tâm xảy ra? –
Trong trường hợp cụ thể của Lua bạn có thể muốn xem https://github.com/rvirding/luerl mà là một thực hiện của Lua trong Erlang. Bạn chỉ cần tải và thực thi mã Lua trong một quá trình erlang (vì vậy bạn có thể có nhiều bộ đánh giá đồng thời lua). – johlo