Sợi ReactPHP
Tôi xin giới thiệu một RFC để thêm các sợi full-stack vào PHP. https. //wiki. php. mạng/rfc/sợi Show Các sợi chủ yếu được sử dụng để triển khai các luồng xanh hoặc coroutine cho I/O không đồng bộ. Sợi tương tự như sợi, ngoại trừ sợi tồn tại trong một sợi đơn và yêu cầu lập lịch trình hợp tác của sợi theo quy trình. Vì các sợi quang không yêu cầu chuyển đổi ngữ cảnh CPU đầy đủ nên chúng nhẹ và hiệu quả hơn so với đa xử lý hoặc phân luồng để chờ I/O Việc triển khai dưới dạng tiện ích mở rộng có tại https. //github. com/amphp/ext-sợi Sợi là một tính năng phức tạp. RFC chứa nhiều ví dụ và liên kết đến mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể, tuy nhiên tôi chắc chắn sẽ có nhiều câu hỏi và mối quan tâm hơn. Rất mong nhận được phản hồi và thảo luận Aaron Piotrowski chưa đọc Xin chào Aaron, điều này rất thú vị với tôi. Tôi có thể hỏi tại sao cách tiếp cận này như Bạn cũng đã đề cập rằng điều này không thực sự được sử dụng trực tiếp, nhưng với Tôi hy vọng tôi không chỉ trích, tôi chỉ tò mò. Cảm ơn bạn vì Trân trọng, Peter Chào mọi người Tôi xin giới thiệu một RFC để thêm các sợi full-stack vào PHP Các sợi chủ yếu được sử dụng để triển khai các luồng xanh hoặc coroutine cho Việc triển khai dưới dạng tiện ích mở rộng có tại https. //github. com/amphp/ext-sợi Sợi là một tính năng phức tạp. RFC chứa nhiều ví dụ và liên kết đến Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php chưa đọc Chào Peter, Xin chào Aaron, điều này rất thú vị với tôi. Tôi có thể hỏi tại sao cách tiếp cận này như Lời hứa dẫn đến sự cố "Chức năng của bạn có màu gì" như được mô tả trong phần giới thiệu RFC. Trả lại lời hứa từ các chức năng có nghĩa là các chức năng gọi các chức năng đó cũng phải trả lại lời hứa, dẫn đến toàn bộ ngăn xếp cuộc gọi cần trả lại lời hứa Sợi là một phương pháp thực hiện các coroutine hoặc các chức năng có thể bị gián đoạn. Các lời hứa có thể vẫn được sử dụng làm trình giữ chỗ trong các thư viện sử dụng sợi, nhưng các coroutine được viết bằng sợi không phải trả lại một trình giữ chỗ khác. Các sợi cho phép mã không đồng bộ không thể phân biệt được với mã đồng bộ hóa, trái ngược với cách tiếp cận trong đó các chức năng không đồng bộ phải trả về một lời hứa Bạn cũng đã đề cập rằng điều này không thực sự được sử dụng trực tiếp, nhưng với Vì hầu hết mã được viết cho PHP đều bị chặn, vâng, các thư viện/khung công tác như vậy sẽ cần cung cấp chức năng như trình điều khiển cơ sở dữ liệu. Cả AMPHP và ReactPHP đều đã có sẵn trình điều khiển không đồng bộ cho một số hệ thống cơ sở dữ liệu phổ biến khác nhau. Trình điều khiển postgres, mysql và redis của AMPHP đã có phiên bản sử dụng sợi quang Tôi hy vọng tôi không chỉ trích, tôi chỉ tò mò. Cảm ơn bạn vì Bạn đã không tỏ ra quan trọng chút nào. Đây là những câu hỏi hay để hỏi. Tôi cũng nghĩ rằng nếu PHP thêm hỗ trợ cho mã không đồng bộ thì nó sẽ thuận lợi hơn so với các ngôn ngữ khác. Tôi nghĩ rằng các sợi mang lại lợi thế khác biệt khi sử dụng lời hứa cho mã không đồng bộ Chúc mừng, chưa đọc Xin chào Aaron, Đầu tiên, tôi muốn nói rằng tôi thích đề xuất này và rất muốn thấy nó xuất hiện trong bản phát hành PHP tiếp theo, nhưng tôi có một câu hỏi liên quan đến điều này Lời hứa dẫn đến sự cố "Chức năng của bạn có màu gì" như được mô tả trong phần giới thiệu RFC. Trả lại lời hứa từ các chức năng có nghĩa là các chức năng gọi các chức năng đó cũng phải trả lại lời hứa, dẫn đến toàn bộ ngăn xếp cuộc gọi cần trả lại lời hứa Hack-Lang cung cấp chức năng Trân trọng, Saif ‐‐‐‐‐‐‐ Tin nhắn gốc ‐‐‐‐‐‐‐ Chào Peter, Xin chào Aaron, điều này rất thú vị với tôi. Tôi có thể hỏi tại sao cách tiếp cận này như Lời hứa dẫn đến sự cố "Chức năng của bạn có màu gì" như được mô tả trong phần giới thiệu RFC. Trả lại lời hứa từ các chức năng có nghĩa là các chức năng gọi các chức năng đó cũng phải trả lại lời hứa, dẫn đến toàn bộ ngăn xếp cuộc gọi cần trả lại lời hứa Sợi là một phương pháp thực hiện các coroutine hoặc các chức năng có thể bị gián đoạn. Các lời hứa có thể vẫn được sử dụng làm trình giữ chỗ trong các thư viện sử dụng sợi, nhưng các coroutine được viết bằng sợi không phải trả lại một trình giữ chỗ khác. Các sợi cho phép mã không đồng bộ không thể phân biệt được với mã đồng bộ hóa, trái ngược với cách tiếp cận trong đó các chức năng không đồng bộ phải trả về một lời hứa Bạn cũng đã đề cập rằng điều này không thực sự được sử dụng trực tiếp, nhưng với Vì hầu hết mã được viết cho PHP đều bị chặn, vâng, các thư viện/khung công tác như vậy sẽ cần cung cấp chức năng như trình điều khiển cơ sở dữ liệu. Cả AMPHP và ReactPHP đều đã có sẵn trình điều khiển không đồng bộ cho một số hệ thống cơ sở dữ liệu phổ biến khác nhau. Trình điều khiển postgres, mysql và redis của AMPHP đã có phiên bản sử dụng sợi quang Tôi hy vọng tôi không chỉ trích, tôi chỉ tò mò. Cảm ơn bạn vì Bạn đã không tỏ ra quan trọng chút nào. Đây là những câu hỏi hay để hỏi. Tôi cũng nghĩ rằng nếu PHP thêm hỗ trợ cho mã không đồng bộ thì nó sẽ thuận lợi hơn so với các ngôn ngữ khác. Tôi nghĩ rằng các sợi mang lại lợi thế khác biệt khi sử dụng lời hứa cho mã không đồng bộ Chúc mừng, Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php chưa đọc Xin chào Aaron, Đầu tiên, tôi muốn nói rằng tôi thích đề xuất này và rất muốn thấy nó xuất hiện trong bản phát hành PHP tiếp theo, nhưng tôi có một câu hỏi liên quan đến điều này Lời hứa dẫn đến sự cố "Chức năng của bạn có màu gì" như được mô tả trong phần giới thiệu RFC. Trả lại lời hứa từ các chức năng có nghĩa là các chức năng gọi các chức năng đó cũng phải trả lại lời hứa, dẫn đến toàn bộ ngăn xếp cuộc gọi cần trả lại lời hứa Hack-Lang cung cấp chức năng
Trân trọng, Saif Chào Saif, 5 triển khai chờ đợi đồng bộ (tôi không biết chi tiết về cách thức triển khai của nó, có thể liên quan đến việc nhập và thoát khỏi vòng lặp sự kiện tích hợp sẵn), nhưng nó không giải quyết được vấn đề mà các chức năng sử dụng 6 cần được khai báo bằng cách sử dụng 7 và trả về . Ví dụ của bạn khai báo 8 là không đồng bộ, trong khi một hàm tương tự sử dụng API sợi được đề xuất sẽ không cần thay đổi khai báo hàm để sử dụng 9. Có một ví dụ trong RFC sử dụng 0 rất giống với mẫu mã của bạnFibers cho phép các giao diện hiện có được triển khai bằng cách sử dụng I/O đồng bộ hóa hoặc không đồng bộ vì giao diện không cần thay đổi để trả lại lời hứa/chờ đợi Chúc mừng, chưa đọc
Điều này thật thú vị và có khả năng rất hữu ích Tôi tò mò về cách bạn đề xuất quyền truy cập vào bộ nhớ dùng chung trên các sợi quang? -Mike P. S. Bạn đã xem chức năng đồng thời như trong GoLang[1] e. g. kênh, trong đó câu thần chú là "Không giao tiếp bằng cách chia sẻ bộ nhớ; thay vào đó, hãy chia sẻ bộ nhớ bằng cách giao tiếp?" [1] chưa đọc Chào mọi người Tôi xin giới thiệu một RFC để thêm các sợi full-stack vào PHP. https. //wiki. php. mạng/rfc/sợi Các sợi chủ yếu được sử dụng để triển khai các luồng xanh hoặc coroutine cho I/O không đồng bộ. Sợi tương tự như sợi, ngoại trừ sợi tồn tại trong một sợi đơn và yêu cầu lập lịch trình hợp tác của sợi theo quy trình. Vì các sợi quang không yêu cầu chuyển đổi ngữ cảnh CPU đầy đủ nên chúng nhẹ và hiệu quả hơn so với đa xử lý hoặc phân luồng để chờ I/O Việc triển khai dưới dạng tiện ích mở rộng có tại https. //github. com/amphp/ext-sợi Sợi là một tính năng phức tạp. RFC chứa nhiều ví dụ và liên kết đến mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể, tuy nhiên tôi chắc chắn sẽ có nhiều câu hỏi và mối quan tâm hơn. Rất mong nhận được phản hồi và thảo luận Điều này thật thú vị và có khả năng rất hữu ích Tôi tò mò về cách bạn đề xuất quyền truy cập vào bộ nhớ dùng chung trên các sợi quang? -Mike P. S. Bạn đã xem chức năng đồng thời như trong GoLang[1] e. g. kênh, trong đó câu thần chú là "Không giao tiếp bằng cách chia sẻ bộ nhớ; thay vào đó, hãy chia sẻ bộ nhớ bằng cách giao tiếp?" [1] Chào Mike, Các sợi không thay đổi bản chất đơn luồng của PHP. Chỉ một sợi quang có thể chạy cùng một lúc, vì vậy bộ nhớ không thể được sửa đổi đồng thời Có các vấn đề về đồng bộ hóa khi viết mã không đồng bộ bằng cách sử dụng các coroutine có ngăn xếp hoặc có ngăn xếp, vì bất kỳ ai đã từng làm việc với AMPHP hoặc ReactPHP đều có thể cho bạn biết. Nhiều sợi (coroutines, green-threads, bất cứ thứ gì bạn muốn gọi chúng) sẽ xen kẽ thực thi. Nhiều sợi xen kẽ có thể thay đổi trạng thái đối tượng giữa tạm dừng và tiếp tục, điều mà tôi đoán là điều bạn lo ngại hơn là sửa đổi đồng thời theo nghĩa đen có thể xảy ra với các luồng. RFC không cung cấp các công cụ để đồng bộ hóa truy cập bộ nhớ, vì chúng có thể được triển khai trong không gian người dùng. Fibers không cung cấp toàn bộ API, chỉ cần API "bare-metal" để triển khai các kiểu đồng thời khác nhau trong mã không gian người dùng AMPHP cung cấp các công cụ đồng bộ hóa chẳng hạn như mutexes, semaphores, bưu kiện và kênh trong https. //github. com/ampphp/đồng bộ https. //github. com/amphp/đồng bộ hóa và https. //github. com/ampphp/song song https. //github. com/ampphp/song song. Các thư viện khác có thể cung cấp các công cụ tương tự, mặc dù có lẽ với cách tiếp cận khác. Chúng tôi cũng thích kiểu Go của đồng thời và tìm cách mô phỏng nó trong AMPHP v3 Chúc mừng, chưa đọc Chào mọi người Tôi xin giới thiệu một RFC để thêm các sợi full-stack vào PHP. https. //wiki. php. mạng/rfc/sợi https. //wiki. php. mạng/rfc/sợi Các sợi chủ yếu được sử dụng để triển khai các luồng xanh hoặc coroutine cho I/O không đồng bộ. Sợi tương tự như sợi, ngoại trừ sợi tồn tại trong một sợi đơn và yêu cầu lập lịch trình hợp tác của sợi theo quy trình. Vì các sợi quang không yêu cầu chuyển đổi ngữ cảnh CPU đầy đủ nên chúng nhẹ và hiệu quả hơn so với đa xử lý hoặc phân luồng để chờ I/O Việc triển khai dưới dạng tiện ích mở rộng có tại https. //github. com/amphp/ext-sợi https. //github. com/amphp/ext-sợi Sợi là một tính năng phức tạp. RFC chứa nhiều ví dụ và liên kết đến mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể, tuy nhiên tôi chắc chắn sẽ có nhiều câu hỏi và mối quan tâm hơn. Rất mong nhận được phản hồi và thảo luận Điều này thật thú vị và có khả năng rất hữu ích Tôi tò mò về cách bạn đề xuất quyền truy cập vào bộ nhớ dùng chung trên các sợi quang? -Mike P. S. Bạn đã xem chức năng đồng thời như trong GoLang[1] e. g. kênh, trong đó câu thần chú là "Không giao tiếp bằng cách chia sẻ bộ nhớ; thay vào đó, hãy chia sẻ bộ nhớ bằng cách giao tiếp?" [1] < not communicate by sharing,race conditions, memory management etc>. Chào Mike, Cảm ơn vi đa trả lơi Các sợi không thay đổi bản chất đơn luồng của PHP. Chỉ một sợi quang có thể chạy cùng một lúc, vì vậy bộ nhớ không thể được sửa đổi đồng thời. Có các vấn đề về đồng bộ hóa khi viết mã không đồng bộ bằng cách sử dụng coroutine stackless hoặc stackful, vì bất kỳ ai đã từng làm việc với AMPHP hoặc ReactPHP đều có thể cho bạn biết. Nhiều sợi (coroutines, green-threads, bất cứ thứ gì bạn muốn gọi chúng) sẽ xen kẽ thực thi Vì vậy, nếu tôi hiểu chính xác, một sợi quang có thể chặn tất cả các sợi khác, vì vậy mã sợi quang sẽ cần phải hoạt động tốt và không bị chặn giống như cách mã Node không được chặn khi được sử dụng làm máy chủ web? Nhiều sợi xen kẽ có thể thay đổi trạng thái đối tượng giữa tạm dừng và tiếp tục, điều mà tôi đoán là điều bạn lo ngại hơn là sửa đổi đồng thời theo nghĩa đen có thể xảy ra với các luồng Chính xác RFC không cung cấp các công cụ để đồng bộ hóa truy cập bộ nhớ, vì chúng có thể được triển khai trong không gian người dùng Tôi có thể yêu cầu một phần thảo luận về cách điều đó có thể được thực hiện trong không gian người dùng trong RFC không, ít nhất là với một số mã giả đơn giản hoặc nếu nó không tầm thường hơn một liên kết đến nơi nó được thảo luận trong Fibers không cung cấp toàn bộ API, chỉ cần API "bare-metal" để triển khai các kiểu đồng thời khác nhau trong mã không gian người dùng AMPHP cung cấp các công cụ đồng bộ hóa chẳng hạn như mutexes, semaphores, bưu kiện và kênh trong https. //github. com/ampphp/đồng bộ https. //github. com/amphp/đồng bộ hóa và https. //github. com/ampphp/song song https. //github. com/ampphp/song song. Các thư viện khác có thể cung cấp các công cụ tương tự, mặc dù có lẽ với cách tiếp cận khác. Chúng tôi cũng thích kiểu Go của đồng thời và tìm cách mô phỏng nó trong AMPHP v3 Cảm ơn trước -Mike chưa đọc Chào Mike, Tôi có thể yêu cầu một phần thảo luận về cách điều đó có thể được thực hiện trong không gian người dùng trong RFC không, ít nhất là với một số mã giả đơn giản hoặc nếu nó không tầm thường hơn một liên kết đến nơi nó được thảo luận trong Chắc chắn rồi. Tôi đã thêm một ví dụ ngắn về triển khai một mutex vào RFC bên dưới. Mã này sử dụng một hàng đợi đơn giản gồm các sợi đang chờ truy cập vào mutex để lấy và giải phóng khóa Một kênh có thể được triển khai với hàng đợi tin nhắn trong đó sợi quang nhận bị tạm dừng nếu hàng đợi trống. Gửi tin nhắn trên kênh sẽ nối lại sợi quang bị treo đang chờ nhận tin nhắn Hy vọng rằng sẽ giúp. Nếu điều gì đó vẫn chưa rõ ràng hoặc một ví dụ bổ sung sẽ hữu ích, đừng ngần ngại hỏi Chúc mừng chưa đọc Xin chào Mike Schinkel,
(Tôi bắt đầu viết bài này trước khi Aaron gửi phản hồi khác) [Đồng thời không phải là song song](văn bản của https. //Blog. golang. org/waza-talk , không phải video), Theo tôi hiểu, đề xuất này tương tự như cách hoạt động đồng thời trong nút cho mã được viết bằng JS - https. // stackoverflow. com/câu hỏi/29977049/how-does-concurrency-work-in-nodejs Thanks,
chưa đọc Xin chào một lần nữa Aaron, Tôi đã chơi xung quanh với điều này một chút, và tôi có thêm một số 1,biến nó thành 2 và thêm một số chức năng "là" để phù hợp hơn với mộtchất xơ thông thường Vì bản thân 1 cũng là một chất xơ, tại sao nó cần phải là mộtlớp riêng? thay vì không chỉ biến một sợi quang thông thường thành một bộ lập lịch trong vùng người dùng Bạn có thể có hai hoặc nhiều lịch trình không? lịch biểu và gọi một sợi quang bên trong một sợi quang theo cách đệ quy? Liên quan đến điều đó, tôi nhận thấy rằng không thể gọi 4 từtrong bộ lập lịch, tại sao vậy? điều này để ngăn không cho nó được chuyển sang một trình lập lịch trình khác? Ngoài ra, đi theo cách khác, thay vì biến bộ lập lịch thành 5, 6, và những loại hàm đó? không phải nó chỉ là một cuộc gọi lại sao? 7?Điều này sẽ loại bỏ nhu cầu về một lớp lập lịch trình đặc biệt và nhu cầu về 9. Mỗi 9cuộc gọi sẽ nổi lên thông qua các cuộc gọi lại của bộ lập lịch đã đăng ký. Cái này sẽ cho phép các bộ lập lịch cạnh tranh làm việc tốt hơn với nhau, thay vì một bộ lập lịch phải hoàn thành trước khi bộ lập lịch cao hơn có thể chạy tiếp theo vòng Dù bằng cách nào, không phải sợi quang đã biết nó đang ở trong bộ lập lịch nào khi nó Tôi nghĩ rằng điều này sẽ đi cùng với việc đơn giản hóa nó và tiếp tục thực hiện Dù sao, một cái gì đó như thế này?
nối lại sợi chính. Bài kiểm tra Btw, đây chỉ là tôi đang suy nghĩ, tôi không biết đủ về sợi Thanks,
chưa đọc Chào Peter, Tôi đã chơi xung quanh với điều này một chút và tôi có thêm một số câu hỏi. Tôi thấy bạn gần đây đã thay đổi cách thức hoạt động của Vì bản thân 1 cũng là một sợi, tại sao nó cần phải là một lớp riêng biệt? 1 là "đặc biệt" vì mã người dùng không kiểm soát việc tạm dừng/tiếp tục sợi bên dưới, vì vậy 1 là một lớp khác với 5 không có các phương thức đó. Bên trong, sợi người dùng và sợi lập lịch tương tự nhau, nhưng tôi muốn phân biệt chúng trong mã người dùng 1 gần đây đã thay đổi từ giao diện thành lớp vì chúng tôi phát hiện ra rằng việc tự động tạo sợi bộ lập lịch bên trong sẽ gây khó khăn cho bộ điều hợp hoặc trình bao bọc của 1 không thể tạo nhiều sợi bộ lập lịch nội bộ khi chỉ nên có một sợi bộ lập lịch duy nhất. API phần lớn hoạt động giống nhau, nhưng hiện tại việc tạo sợi lập lịch rõ ràng trong mã người dùng thay vì được thực hiện nội bộ. Bằng cách này, bộ điều hợp hoặc trình bao bọc có thể trả về một phiên bản 1 duy nhất. Cần nhiều mã hơn trong thư viện người dùng, nhưng cung cấp tính linh hoạt cao hơn
Bạn có thể có hai hoặc nhiều bộ lập lịch trong một tập lệnh. Chỉ một người có thể chạy cùng một lúc
Thiết kế này yêu cầu phải nhập một sợi lập lịch giữa việc tạm dừng một sợi của người dùng và tiếp tục một sợi của người dùng khác. Sợi người dùng được thiết kế độc lập. Nếu hai sợi người dùng cần giao tiếp, họ nên sử dụng thứ gì đó tương tự như các kênh của Go để trao đổi dữ liệu
Một cáp quang của bộ lập lịch không thể bị treo hoặc tiếp tục bởi mã người dùng, vì vậy sẽ không hữu ích khi tham chiếu đến cáp quang đó
Bộ lập lịch được nhập là dành riêng cho mã gọi 9. Việc đăng ký một bộ lập lịch toàn cầu sẽ chỉ yêu cầu một bộ lập lịch duy nhất được sử dụng trong tập lệnh. Chỉ một bộ lập lịch duy nhất được nhập vào cuộc gọi tới 9, không phải nhiều bộ lập lịch. Đăng ký bộ lập lịch hoặc gói mã ứng dụng trong bản soạn sẵn tùy thuộc vào thư viện đang được sử dụng là điều mà API này đang cố gắng tránh
Không, một sợi quang có khả năng sử dụng các bộ lập lịch khác nhau tại các điểm treo khác nhau. Bộ lập lịch khởi động một sợi không nhất thiết phải là bộ lập lịch duy nhất tạm ngưng sợi Hy vọng rằng điều đó sẽ giúp hiểu cách thức hoạt động của API. Vui lòng xem cách amphp v3 sử dụng sợi trong các ví dụ này https. //github. com/amphp/amp/tree/v3/examples/pipeline hoặc trong sợi phản ứng https. //github. com/trowski/react-fiber/tree/master/examples trong đó API Fiber được xử lý bởi thư viện thay vì mã “ứng dụng” Chúc mừng, chưa đọc
Hi Aaron, đây là một chức năng rất thú vị và đáng hoan nghênh. tôi phải đi Từ POV của tôi, các hiệu ứng trên các tiện ích mở rộng khác là yếu tố quan trọng nhất, Hiện tại, bất kỳ PHP Profiler nào cũng chỉ phải quản lý một ngăn xếp "open Tiện ích mở rộng có biết sợi "hoạt động" là gì để từ Bạn có thể thêm một phần vào RFC giải thích cách chuyển đổi giữa các sợi
chưa đọc Hi Aaron, đây là một chức năng rất thú vị và đáng hoan nghênh. tôi phải đi Từ POV của tôi, các hiệu ứng trên các tiện ích mở rộng khác là yếu tố quan trọng nhất, Chào Benjamin, Xin lỗi vì một chút chậm trễ trong việc trả lời. Tôi đã bận rộn trong vài ngày qua Các trình cấu hình quản lý chồng khung của riêng chúng sẽ phải được sửa đổi để tính đến các sợi. Tiện ích mở rộng hiện cung cấp API để truy cập vào sợi hiện tại và xác định duy nhất từng sợi khác nhau API nội bộ cho điều này sẽ cần thảo luận thêm giữa những người đóng góp nội bộ còn lại và hy vọng là tác giả của các tiện ích mở rộng đó. Tôi đã bỏ qua bất kỳ API nào cho điều này từ RFC vì nó không ảnh hưởng đến mã người dùng Hiện tại, bất kỳ PHP Profiler nào cũng chỉ phải quản lý một ngăn xếp "open Tiện ích mở rộng có biết sợi "hoạt động" là gì để từ Bốn chức năng hiện được cung cấp để xác định sợi thực thi hiện tại Những thứ này cho phép bạn lấy gốc và sợi quang hiện tại cũng như ID được liên kết với sợi quang Bạn có thể thêm một phần vào RFC giải thích cách chuyển đổi giữa các sợi Tôi đã thêm một phần ngắn trong Câu hỏi thường gặp có tên "Các ngăn xếp thực thi được hoán đổi như thế nào?", Các vết lùi hiện bị giới hạn chỉ bao gồm sợi hiện đang thực thi. Có thể bao gồm các dấu vết ngược của sợi trong ngăn xếp thực thi, nhưng tôi gặp sự cố khi cố gắng triển khai điều này trong tiện ích mở rộng trong khi tắt máy do ngăn xếp được giải phóng. Một cái gì đó tôi nghĩ có thể được giải quyết nếu thêm vào lõi với sự trợ giúp của ai đó quen thuộc hơn với cách lưu giữ các tham chiếu đến các ngăn xếp này và những gì nên sửa đổi trong các hàm tạo dấu vết ngược Chúc mừng, chưa đọc Hi Aaron, đây là một chức năng rất thú vị và đáng hoan nghênh. tôi phải đi Từ POV của tôi, các hiệu ứng trên các tiện ích mở rộng khác là yếu tố quan trọng nhất, Chào Benjamin, Xin lỗi vì một chút chậm trễ trong việc trả lời. Tôi đã bận rộn trong vài ngày qua Các trình cấu hình quản lý chồng khung của riêng chúng sẽ phải được sửa đổi để tính đến các sợi. Tiện ích mở rộng hiện cung cấp API để truy cập vào sợi hiện tại và xác định duy nhất từng sợi khác nhau API nội bộ cho điều này sẽ cần thảo luận thêm giữa những người đóng góp nội bộ còn lại và hy vọng là tác giả của các tiện ích mở rộng đó. Tôi đã bỏ qua bất kỳ API nào cho điều này từ RFC vì nó không ảnh hưởng đến mã người dùng Hiện tại, bất kỳ PHP Profiler nào cũng chỉ phải quản lý một ngăn xếp "open Tiện ích mở rộng có biết sợi "hoạt động" là gì để từ Bốn chức năng hiện được cung cấp để xác định sợi thực thi hiện tại Những thứ này cho phép bạn lấy gốc và sợi quang hiện tại cũng như ID được liên kết với sợi quang Tôi nghĩ có lẽ sẽ thuận lợi nếu có một người quan sát chưa đọc Tôi nghĩ có lẽ sẽ thuận lợi nếu có một người quan sát Chào Levi, Có, tôi đồng ý và sẽ xem xét triển khai API quan sát viên Chúc mừng, -- Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php chưa đọc Tôi nghĩ có lẽ sẽ thuận lợi nếu có một người quan sát Chào Levi, Có, tôi đồng ý và sẽ xem xét triển khai API quan sát viên Chúc mừng, -- Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php https. //www. php. mạng/hủy đăng ký. php Chào Levi, Tôi đã triển khai một trình quan sát thông báo cho các trình xử lý đã đăng ký bất cứ khi nào bối cảnh sợi quang hiện tại được chuyển đổi typedef void (*zend_observer_fiber_switch_handler)(zend_fiber *từ, zend_fiber *đến); Điều này hoạt động tương tự như API quan sát lỗi zend_fiber cung cấp quyền truy cập vào một ID duy nhất, zend_execute_data, v.v. điều đó là đủ cho trình biên dịch mã, trình gỡ lỗi, v.v. Một con trỏ là Hãy cho tôi biết nếu còn thiếu điều gì đó hoặc có thể cải thiện Chúc mừng, chưa đọc Xin chào Aaron Piotrowski,
Tôi đã xem repo amphp/ext-fiber cách đây vài tuần - không có gì nổi bật như một mối quan tâm lớn nhưng tôi chỉ quen thuộc với việc phân luồng, 8bao gồm tên cơ sở của tệp trong đầu ra kiểm tra dấu vết lỗi thay vì chỉ 9, v.v.(e. g. thử nghiệm/002-ném. phpt)
Tôi không thấy trong các trường hợp thử nghiệm/rfc 0/ 1/ 2 và macro 3 được xử lý sau một lỗi nghiêm trọng?Tôi không chắc chắn 100% - tôi nghĩ những thứ đó sử dụng setjmp/longjmp trong nội bộ - liệu các lỗi nghiêm trọng có tiếp tục hoạt động nếu có lỗi nghiêm trọng từ bên trong sợi quang (e. g. 4 trên một tệp có lỗi nghiêm trọng trong thời gian biên dịch, chẳng hạn như các tham số trùng lặp)Tôi quên chính xác cách họ làm việc, e. g. trong ngữ cảnh của một máy chủ web trước RFC này - trong nháy mắt, tôi đoán một lỗi nghiêm trọng không thể khôi phục sẽ khiến nhân viên tắt máy Việc ở trong một sợi quang khác và ngăn xếp C khác có cản trở quá trình tắt máy do các lỗi nghiêm trọng không? Thanks, chưa đọc 2021年2月2日 上午11. 04,tyson andre tysonandre775@hotmail. com 写道: Xin chào Aaron Piotrowski, Tôi xin giới thiệu một RFC để thêm các sợi full-stack vào PHP. https. //wiki. php. mạng/rfc/sợi Các sợi chủ yếu được sử dụng để triển khai các luồng xanh hoặc coroutine cho I/O không đồng bộ. Sợi tương tự như sợi, ngoại trừ sợi tồn tại trong một sợi đơn và yêu cầu lập lịch trình hợp tác của sợi theo quy trình. Vì các sợi quang không yêu cầu chuyển đổi ngữ cảnh CPU đầy đủ nên chúng nhẹ và hiệu quả hơn so với đa xử lý hoặc phân luồng để chờ I/O Việc triển khai dưới dạng tiện ích mở rộng có tại https. //github. com/amphp/ext-sợi Sợi là một tính năng phức tạp. RFC chứa nhiều ví dụ và liên kết đến mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể, tuy nhiên tôi chắc chắn sẽ có nhiều câu hỏi và mối quan tâm hơn. Rất mong nhận được phản hồi và thảo luận Tôi đã xem repo amphp/ext-fiber cách đây vài tuần - không có gì nổi bật như một mối quan tâm lớn nhưng tôi chỉ quen thuộc với việc phân luồng,
Tôi không thấy trong các trường hợp thử nghiệm/rfc 0/ 1/ 2 và macro 3 được xử lý sau một lỗi nghiêm trọng?Tôi không chắc chắn 100% - tôi nghĩ những thứ đó sử dụng setjmp/longjmp trong nội bộ - liệu các lỗi nghiêm trọng có tiếp tục hoạt động nếu có lỗi nghiêm trọng từ bên trong sợi quang (e. g. 4 trên một tệp có lỗi nghiêm trọng trong thời gian biên dịch, chẳng hạn như các tham số trùng lặp)Tôi quên chính xác cách họ làm việc, e. g. trong ngữ cảnh của một máy chủ web trước RFC này - trong nháy mắt, tôi đoán một lỗi nghiêm trọng không thể khôi phục sẽ khiến nhân viên tắt máy Việc ở trong một sợi quang khác và ngăn xếp C khác có cản trở quá trình tắt máy do các lỗi nghiêm trọng không? Thanks, -- Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php Xin chào Tyson Andre, Chúng tôi đã thử hai giải pháp khác nhau trong Swoole để giải quyết vấn đề này Vì mỗi coroutine có một ngăn xếp C độc lập và vị trí ngăn xếp C được lưu bởi gói cứu trợ là bất hợp pháp trong các coroutine khác, nên chúng tôi phải thực hiện dự phòng zend_try và zend_catch trong mỗi coroutine. Khi xảy ra lỗi nghiêm trọng, hãy chuyển đến ngăn xếp C tương ứng với hàm main(), sau đó thoát qua quy trình bình thường của PHP. Tuy nhiên, phương pháp này không an toàn trăm phần trăm. Rất khó để Swoole tái chế các coroutine còn sống sót khác. Trong trường hợp cực đoan, một số vấn đề về bộ nhớ vẫn có thể xảy ra Tôi thích cái khác hơn - Do những nỗ lực tuyệt vời của PHP8, các lỗi nghiêm trọng trong PHP đã giảm đi rất nhiều và được thay thế bằng các cơ chế ngoại lệ. Do đó, khi xảy ra lỗi nghiêm trọng với khả năng cực kỳ thấp, thoát trực tiếp qua exit() có thể là cách an toàn nhất. Tất nhiên, điều này sẽ khiến register_shutdown_function bị lỗi Trân trọng, chưa đọc
Hi Aaron, Cảm ơn vì lời đề nghị. Công thái học của I/O không đồng bộ trong PHP chắc chắn còn lại Bất chấp những lời giải thích của bạn trong RFC và chủ đề này, tôi vẫn gặp khó khăn Hiểu biết hiện tại của tôi là FiberScheduler là một loại đặc biệt của Điều không rõ ràng đối với tôi là tại sao sợi lịch trình cần phải được Giải pháp thay thế hạn chế hơn là sử dụng Fiber. đình chỉ () trở lại Trân trọng, chưa đọc Này Nikita, Cảm ơn vì lời đề nghị. Công thái học của I/O không đồng bộ trong PHP chắc chắn còn lại một cái gì đó được mong muốn ngay bây giờ, và những cải tiến trong lĩnh vực này là Bất chấp những lời giải thích của bạn trong RFC và chủ đề này, tôi vẫn gặp khó khăn Hiểu biết hiện tại của tôi là FiberScheduler là một loại đặc biệt của Vâng, đó là chính xác. Sợi được sử dụng cho đa tác vụ hợp tác và Điều không rõ ràng đối với tôi là tại sao sợi lịch trình cần phải được Có một vài lý do để tạo sự khác biệt ở đây chính -> A -> B -> C -> A (chấm dứt) -> C (trước đó) -> B (chấm dứt) -> Trong ví dụ trên, danh sách liên kết quang trước đó từ C trở lại chính Tôi chắc rằng Aaron có thể trình bày một vài lý do khác để tiếp tục chia tay Giải pháp thay thế hạn chế hơn là sử dụng Fiber. đình chỉ () trở lại Đúng, điều này sẽ không cho phép Fiber cấp cao nhất. đình chỉ(). Nó cũng sẽ làm cho Tốt, chưa đọc Này Nikita, Cảm ơn vì lời đề nghị. Công thái học của I/O không đồng bộ trong PHP chắc chắn còn lại một cái gì đó được mong muốn ngay bây giờ, và những cải tiến trong lĩnh vực này là Bất chấp những lời giải thích của bạn trong RFC và chủ đề này, tôi vẫn gặp khó khăn Hiểu biết hiện tại của tôi là FiberScheduler là một loại đặc biệt của Vâng, đó là chính xác. Sợi được sử dụng cho đa tác vụ hợp tác và Điều không rõ ràng đối với tôi là tại sao sợi lịch trình cần phải được Có một vài lý do để tạo sự khác biệt ở đây chính -> A -> B -> C -> A (chấm dứt) -> C (trước đó) -> B (chấm dứt) -> Trong ví dụ trên, danh sách liên kết quang trước đó từ C trở lại chính Tôi chắc rằng Aaron có thể trình bày một vài lý do khác để tiếp tục chia tay Cảm ơn, tôi đã không xem xét trường hợp kết thúc sợi ở đây. Nhưng có thể là một Nếu bạn trung thành với khái niệm FiberScheduler, thì bạn có thể muốn xem xét lớp FiberScheduler { Cả hai phương pháp đều bị ràng buộc với bộ lập lịch trong đó tạm dừng "tạm dừng" trở lại Trân trọng, Giải pháp thay thế hạn chế hơn là sử dụng Fiber. đình chỉ () trở lại sợi gốc (cái nối lại() nó). Ở đây, sợi gốc Đúng, điều này sẽ không cho phép Fiber cấp cao nhất. đình chỉ(). Nó cũng sẽ Tốt, chưa đọc Nếu bạn trung thành với khái niệm FiberScheduler, thì bạn có thể muốn xem xét lớp FiberScheduler { Cả hai phương pháp đều bị ràng buộc với bộ lập lịch trong đó tạm dừng "tạm dừng" trở lại Trân trọng, Xin chào Nikita, Tôi đã cân nhắc việc thêm các phương thức bắt đầu, tiếp tục và ném vào FiberScheduler như bạn đã đề xuất, tuy nhiên tôi không chắc nó sẽ giúp API rõ ràng hơn. Gọi lại (hàm, phương thức, v.v. ) được sử dụng để tạo phiên bản của FiberScheduler không ngay lập tức có tham chiếu đến đối tượng FiberScheduler đã tạo, do đó, việc sử dụng đối tượng trong cuộc gọi lại đó sẽ rất khó xử. Một giải pháp sẽ là phương pháp Mặt khác, Niklas đã vạch ra những lý do để FiberScheduler trở thành một sợi duy nhất – tạm dừng {main}, khả năng tương tác giữa các thư viện bằng cách sử dụng các bộ lập lịch khác nhau và chạy các bộ lập lịch để hoàn thành khi chấm dứt tập lệnh
Khi bắt đầu hoặc nối lại một sợi quang, điểm thực hiện hiện tại trong sợi quang hiện tại được lưu trữ làm điểm để chuyển đến khi sợi quang bắt đầu/tiếp tục tạm dừng hoặc kết thúc. Do đó, các sợi quang chỉ được đẩy hoặc bật ra khỏi ngăn xếp, bạn không thể chuyển sang một sợi quang đang chạy, vì một sợi quang khác cao hơn trong ngăn xếp sẽ không còn quay trở lại điểm thực thi chính xác khi bị treo hoặc kết thúc Vì FiberScheduler bên trong chỉ là một sợi khác, nên không có gì thực sự đặc biệt được thực hiện để chuyển sang bộ lập lịch sợi. Yêu cầu tạm dừng đối với bộ lập lịch biểu thay vì sợi tùy ý ngăn người dùng cố gắng chuyển sang sợi đang chạy Chúc mừng, chưa đọc
Chào bạn, Rất vui khi thấy rằng RFC của Fiber đã trở lại chương trình nghị sự Hãy để tôi giới thiệu bản thân mình đầu tiên. Tôi là người đóng góp rất tích cực cho Swoole và cũng là thành viên cốt lõi của nhóm phát triển Swoole Mặc dù Swoole chưa được đề cập trong RFC, nhưng Swoole đã hoạt động cho tính năng async/coroutine trong nhiều năm và luôn làm tốt nhất để được hợp nhất vào php-src. Rất khó để hợp nhất hoàn toàn Swoole vào php-src vì Swoole có tính hệ thống và phức tạp. Ngay cả coroutine là cốt lõi nhưng cũng là một phần nhỏ của Swoole Trong những năm gần đây, Swoole đã cam kết cải thiện tính ổn định và khắc phục các sự cố kỹ thuật. Có thể nói Swoole hiện tại đã rất gần với trạng thái lý tưởng. Hơn nữa, Swoole đã được áp dụng rộng rãi bởi các doanh nghiệp tiên tiến ở Trung Quốc. Nó đã được xác minh bởi một số lượng lớn các ứng dụng trong thế giới thực. Chúng tôi có thể có nhiều kinh nghiệm thực tế hơn trong nhiều chi tiết về việc triển khai công nghệ coroutine Đối với cốt lõi của Fiber, việc chuyển đổi ngữ cảnh của ngăn xếp C và ngăn xếp máy ảo PHP, không có vấn đề nào rõ ràng hơn. Nhưng có một nơi đáng để cải thiện, thực sự. Hơn nữa, chúng tôi có thể thực hiện nhiều chuyển đổi ngữ cảnh hơn, vì Swoole có thể mang lại từ hàm nội bộ PHP, điều này sẽ khiến "@" không hoạt động Như chúng ta có thể thấy, tranh cãi chính là về FiberScehduler. Tôi nghĩ rằng nó được thiết kế cho amphp, tuy nhiên, nó làm cho mã khó hiểu và không cần thiết nếu chúng ta chỉ muốn triển khai coroutine tối thiểu Chỉ cần tạo và chuyển đổi là đủ để triển khai coroutine tối thiểu. Đề xuất Sợi cuối cùng cũng vậy. Việc triển khai bộ lập lịch vẫn còn gây tranh cãi Mặt khác, so với đề xuất Fiber trước đó, thay đổi có giá trị nhất trong đề xuất Fiber mới là giới thiệu công nghệ C stack coroutine Theo tôi, mục tiêu của đề xuất Fiber mới không quá tham vọng. Nó chỉ loại bỏ ô nhiễm ngăn xếp do Promise gây ra. Điều này làm cho phong cách của PHP coroutine không giống như Nodejs đại diện cho coroutine stackless thuần túy, cũng như Lua và Golang đại diện cho coroutine stack thuần túy Một khi PHP có stack coroutine như Fiber, chúng ta có thể làm được nhiều hơn những gì chúng ta có thể làm bây giờ. Vì chúng ta có thể ngắt từ các chức năng nội bộ của PHP, nên chúng ta có thể thay thế tất cả việc triển khai các chức năng chặn PHP, chẳng hạn như 5 và chúng ta cũng có thể thay thế php_stream để có thể thay đổi việc triển khai PDO, mysqli và phpredis thành một cách coroutine, Trên thực tế, nhiều năm trước, các giải pháp giống như amphp đã rất phổ biến trong cộng đồng PHP Trung Quốc. Nhưng chúng đã bị thay thế bởi Swoole, cuối cùng Hiệu suất là một trong những lý do. Bởi vì, thực sự, giao thức phân tích cú pháp bằng PHP bị bất lợi so với phân tích cú pháp bằng C. Mặc dù các giải pháp giống như amphp đã mở rộng các khả năng của PHP, nhưng hiệu suất không đạt yêu cầu. Tuy nhiên, Swoole hoạt động giống như các ngôn ngữ tĩnh khác Mặt khác, chi phí thay thế. Điều đã được chứng minh là hầu hết các lập trình viên PHP muốn tiếp tục sử dụng các ứng dụng khách phổ biến như PDO, mysqli, phpredis và curl, và hệ sinh thái thư viện và gói PHP tuyệt vời dựa trên các ứng dụng khách này khó có thể thay thế. Chi phí di chuyển một ứng dụng PHP hiện đại sang Swoole thấp đến mức không thể tưởng tượng được trước đây. Nhiều trường hợp thành công trong cộng đồng Vì vậy, điều tôi muốn giải thích là một khi lõi PHP đã sẵn sàng chấp nhận đề xuất Fiber, mọi người sẽ bắt đầu suy nghĩ, tiếp theo là gì? . Điều tôi thực sự quan tâm là - nó chỉ đơn giản là loại bỏ sự ô nhiễm của ngăn xếp do Promise gây ra hay nó có kế hoạch cải thiện hiệu suất của các ứng dụng PHP lên hàng trăm lần với chi phí thấp như Swoole đã làm Trân trọng, chưa đọc
Xin chào một lần nữa tất cả mọi người Dựa trên phản hồi cả trong danh sách này và các nơi khác, tôi đã quyết định xóa API FiberScheduler khỏi đề xuất cáp quang API FiberScheduler đã làm tăng đáng kể mức độ phức tạp của việc triển khai và khả năng xảy ra các trường hợp biên cần được xử lý và bảo trì. Mục đích của việc đưa API FiberScheduler vào như một phần của quá trình triển khai được đề xuất là yêu cầu việc sử dụng sợi để có thể tương tác giữa các thư viện khác nhau. Tuy nhiên, điều này có lẽ đã vượt quá khả năng và lõi chỉ nên cung cấp các công cụ cơ bản nhất cho sợi API sợi quang được đề xuất hiện giống với API của Ruby và các ngôn ngữ khác cung cấp API sợi quang. RFC sửa đổi hiện chỉ đề xuất một API tối thiểu cần thiết cho sợi – không hơn, không kém. Tôi tin rằng API đơn giản hóa, tối thiểu này sẽ giải quyết mọi lo ngại về việc thêm API sợi quang vào lõi Tôi muốn mở bỏ phiếu cho RFC này vào khoảng đầu tháng 3, vì vậy vui lòng xem lại API tối thiểu và sớm cung cấp bất kỳ phản hồi nào Như trước đây, amphp v3 (https. //github. com/amphp/amp/tree/v3) và trowski/react-fiber (https. //github. com/trowski/react-fiber) cung cấp các ví dụ thực tế về cách sử dụng sợi ngoài các ví dụ trong RFC Chúc mừng chưa đọc Tôi muốn mở bỏ phiếu cho RFC này vào khoảng đầu tháng 3, vì vậy vui lòng xem lại API tối thiểu và sớm cung cấp bất kỳ phản hồi nào Loại bỏ bộ lập lịch trình có thể là một kế hoạch tốt, nhưng xin vui lòng Sẽ là một nỗi đau thực sự lớn để thúc đẩy mọi người sử dụng cái này Nếu bạn có thể thêm async/await/delay/defer, ngay cả khi nó mất một Đánh dấu Randall chưa đọc Tôi muốn mở bỏ phiếu cho RFC này vào khoảng đầu tháng 3, vì vậy vui lòng xem lại API tối thiểu và sớm cung cấp bất kỳ phản hồi nào Loại bỏ bộ lập lịch có thể là một kế hoạch tốt, nhưng xin vui lòng xem xét lại phạm vi tương lai của bạn Sẽ là một nỗi đau thực sự lớn khi thúc đẩy mọi người sử dụng chức năng này, chỉ để viết lại nó 1 hoặc 2 năm sau vì một cơ chế cú pháp vượt trội hơn rất nhiều đã được giới thiệu Nếu bạn có thể thêm async/await/delay/defer, ngay cả khi phải mất thêm một tháng nữa, điều đó có thể khiến RFC này có tác động lớn hơn và có lợi hơn đáng kể đối với vùng người dùng Đánh dấu Randall -- Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php Chào Mark, API sợi quang chỉ liên quan trực tiếp đến async/await, v.v. Thêm một tính năng như vậy là một đề xuất lớn hơn nhiều và sẽ không phải là một công việc nhỏ. Phạm vi tương lai đề xuất sử dụng sợi trong triển khai async/await, nhưng async/await sẽ không thay thế sợi API sợi quang sẽ xung đột hoặc ngăn async/await được thêm vào PHP trong tương lai. Hai API có thể cùng tồn tại và phục vụ các mục đích khác nhau Chúc mừng, chưa đọc API sợi quang sẽ xung đột hoặc ngăn async/await được thêm vào PHP trong tương lai. Hai API có thể cùng tồn tại và phục vụ các mục đích khác nhau Mặc dù có thể rõ ràng từ phần còn lại của ngữ cảnh của email, nhưng để rõ ràng, tôi muốn nói rằng API Fiber sẽ không xung đột hoặc ngăn không cho async/await được thêm vào PHP trong tương lai |