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

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

của Peter Stalman — xem nguồn

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ư
trái ngược với các mô hình khác như lời hứa, coroutines, v.v.?
async/await trong phạm vi tương lai và tôi cho rằng hầu hết các mẫu này có thể
thực hiện một khi có một chức năng cơ bản. Về cơ bản, tại sao
sợi thay vì x?

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
một thư viện như AMPHP. LÀ kỳ vọng rằng I/O không chặn
chức năng như trình điều khiển cơ sở dữ liệu và hoạt động tập tin được cung cấp bởi
cả thư viện?

Tôi hy vọng tôi không chỉ trích, tôi chỉ tò mò. Cảm ơn bạn vì
thúc đẩy điều này về phía trước, vì async là thứ mà PHP đang thiếu và nên
có IMO để so sánh thuận lợi với các lựa chọn thay thế khác

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
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
vào/ra không đồng bộ. Sợi tương tự như sợi chỉ, ngoại trừ sợi tồn tại bên trong
một luồng duy nhất và yêu cầu lập lịch trình hợp tác của các sợi bởi
tiến trình. Vì các sợi 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 đa xử lý hoặc phân luồng cho
đang 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
Tuy nhiên, mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể
Tôi chắc chắn rằng nhiều câu hỏi và mối quan tâm sẽ phát sinh. Mong chờ
phản hồi và thảo luận

Aaron Piotrowski

Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php

của Aaron Piotrowski — xem nguồn

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ư
trái ngược với các mô hình khác như lời hứa, coroutines, v.v.?
async/await trong phạm vi tương lai và tôi cho rằng hầu hết các mẫu này có thể
thực hiện một khi có một chức năng cơ bản. Về cơ bản, tại sao
sợi thay vì x?

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
một thư viện như AMPHP. LÀ kỳ vọng rằng I/O không chặn
chức năng như trình điều khiển cơ sở dữ liệu và hoạt động tập tin được cung cấp bởi
cả thư viện?

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ì
thúc đẩy điều này về phía trước, vì async là thứ mà PHP đang thiếu và nên
có IMO để so sánh thuận lợi với các lựa chọn thay thế khác

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,
Aaron Piotrowski

của Saif Eddin Gmati — xem nguồn

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

$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
3 cho phép chờ Awaitables trong mã đồng bộ hóa, vì vậy bạn có khả năng chạy nhiều tác vụ không đồng bộ đồng thời mà không phải khai báo toàn bộ ngăn xếp cuộc gọi là "không đồng bộ" hoặc với kiểu trả về "Có thể chờ đợi", điều này không khả thi sao?

use namespace HH\Asio;

async function async_task(): Awaitable {
  await Asio\usleep(1000000);
}

<<__EntryPoint>>
function main(): void {
  $start = microtime(true);

  $async = async {
    concurrent {
      await async_task();
      await async_task();
    };

    return 'hello';
  };

  $result = Asio\join($async);

  printf('Result: %s ( %f )', $result, microtime(true) - $start); // output "Result: hello ( 1.010382 )"
}

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ư
trái ngược với các mô hình khác như lời hứa, coroutines, v.v.?
async/await trong phạm vi tương lai và tôi cho rằng hầu hết các mẫu này có thể
thực hiện một khi có một chức năng cơ bản. Về cơ bản, tại sao
sợi thay vì x?

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
một thư viện như AMPHP. LÀ kỳ vọng rằng I/O không chặn
chức năng như trình điều khiển cơ sở dữ liệu và hoạt động tập tin được cung cấp bởi
cả thư viện?

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ì
thúc đẩy điều này về phía trước, vì async là thứ mà PHP đang thiếu và nên
có IMO để so sánh thuận lợi với các lựa chọn thay thế khác

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,
Aaron Piotrowski


Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php

của Aaron Piotrowski — xem nguồn

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

$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
3 cho phép chờ Awaitables trong mã đồng bộ hóa, vì vậy bạn có khả năng chạy nhiều tác vụ không đồng bộ đồng thời mà không phải khai báo toàn bộ ngăn xếp cuộc gọi là "không đồng bộ" hoặc với kiểu trả về "Có thể chờ đợi", điều này không khả thi sao?

use namespace HH\Asio;

async function async_task(): Awaitable {
 await Asio\usleep(1000000);
}

<<__EntryPoint>>
function main(): void {
 $start = microtime(true);

 $async = async {
   concurrent {
     await async_task();
     await async_task();
   };

   return 'hello';
 };

 $result = Asio\join($async);

 printf('Result: %s ( %f )', $result, microtime(true) - $start); // output "Result: hello ( 1.010382 )"
}

Trân trọng,

Saif

Chào Saif,

$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
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
$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
6 cần được khai báo bằng cách sử dụng
$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
7 và trả về . Ví dụ của bạn khai báo
$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
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
$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
9. Có một ví dụ trong RFC sử dụng
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
0 rất giống với mẫu mã của bạn

Fibers 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,
Aaron Piotrowski

của Mike Schinkel — xem nguồn

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]

của Aaron Piotrowski — xem nguồn

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,
Aaron Piotrowski

của Mike Schinkel — xem nguồn

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

của Aaron Piotrowski — xem nguồn

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
Aaron Piotrowski

của tyson andre — xem nguồn

chưa đọc

Xin chào Mike Schinkel,

Đ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?

(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),
và RFC này không thêm song song vào php
Thay vào đó, RFC là một đề xuất để làm cho đồng thời dễ dàng hơn
Email thông báo rfc nói rằng "sợi tồn tại trong một luồng"
Một cáp quang sẽ phải giải phóng quyền kiểm soát một cách rõ ràng cho bộ lập lịch trình sau khi sửa đổi biến $GLOBALS, v.v.

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
(ở chỗ chỉ có một luồng, nhưng khác ở chỗ việc lên lịch được thực hiện thủ công)

Thanks,

  • tyson

của Peter Stalman — xem nguồn

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ố
câu hỏi. Tôi thấy bạn gần đây đã thay đổi cách thức hoạt động của

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
1,
biến nó thành
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
2 và thêm một số chức năng "là" để phù hợp hơn với một
chất xơ thông thường

Vì bản thân

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
1 cũng là một chất xơ, tại sao nó cần phải là một
lớ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

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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
lớp duy nhất cần được chuyển qua, tại sao không đi nhiều hơn
định tuyến PHP "truyền thống" và tạo mẫu cho nó sau

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
5,
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
6, và những loại hàm đó?
không phải nó chỉ là một cuộc gọi lại sao?
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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ề
chuyển bộ lập lịch trở lại

$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
9. Mỗi
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
9
cuộ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ó
đình chỉ?

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
rộng để cho phép triển khai nhiều vùng người dùng khác nhau (như đã đề cập, chẳng hạn như
amphp và phản ứngphp). Nhưng nó có lẽ không đơn giản hóa C
thực hiện

Dù sao, một cái gì đó như thế này?

$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After

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
để thiết kế nó theo cách này hay cách khác, nhưng tôi cũng hy vọng sẽ hiểu nó nhiều hơn
như đưa ra một vài quan điểm khác nhau về nó

Thanks,
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
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
vào/ra không đồng bộ. Sợi tương tự như sợi chỉ, ngoại trừ sợi tồn tại bên trong
một luồng duy nhất và yêu cầu lập lịch trình hợp tác của các sợi bởi
tiến trình. Vì các sợi 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 đa xử lý hoặc phân luồng cho
đang 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
Tuy nhiên, mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể
Tôi chắc chắn rằng nhiều câu hỏi và mối quan tâm sẽ phát sinh. Mong chờ
phản hồi và thảo luận

Aaron Piotrowski

Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php

của Aaron Piotrowski — xem nguồn

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

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
1, biến nó thành
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
2 và thêm một số chức năng "là" để phù hợp hơn với sợi quang thông thường

Vì bản thân

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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?

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
1 là một lớp khác với
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
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 lịch trình không?

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

Bạn có thể thực hiện mà không cần lập lịch trình và gọi một sợi quang bên trong một sợi quang theo cách đệ quy không?

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

Liên quan đến vấn đề đó, tôi nhận thấy không thể gọi

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
4 từ bên trong bộ lập lịch, tại sao vậy?

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 đó

Ngoài ra, theo cách khác, thay vì biến bộ lập lịch thành một lớp duy nhất cần được chuyển qua, tại sao không đi theo lộ trình PHP "truyền thống" hơn và tạo mẫu cho nó sau

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
5,
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
6 và các loại hàm đó?

Đ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 chuyển lịch trình trở lại

$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
9. Mỗi cuộc gọi
zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()
9 sẽ nổi lên thông qua các cuộc gọi lại của bộ lập lịch biểu đã đăng ký. Điều 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 vòng lặp tiếp theo

Bộ lập lịch được nhập là dành riêng cho mã gọi

$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
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
$fiber = Fiber::this();
$callbacks = [
    fn() => $fiber->resume("Test"),
];

register_fiber_scheduler(function() use ($callbacks) {
    foreach ($callbacks as $callback) {
        $callback();
    }
});

$value = Fiber::suspend();

echo "After resuming main fiber: ", $value, "\n"; // Output: After
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

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ạm dừng sao?

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,
Aaron Piotrowski

của Benjamin Eberlei — xem nguồn

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
vào/ra không đồng bộ. Sợi tương tự như sợi chỉ, ngoại trừ sợi tồn tại bên trong
một luồng duy nhất và yêu cầu lập lịch trình hợp tác của các sợi bởi
tiến trình. Vì các sợi 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 đa xử lý hoặc phân luồng cho
đang 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
Tuy nhiên, mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể
Tôi chắc chắn rằng nhiều câu hỏi và mối quan tâm sẽ phát sinh. Mong chờ
phản hồi và thảo luận

Aaron Piotrowski

Hi Aaron,

đây là một chức năng rất thú vị và đáng hoan nghênh. tôi phải đi
thông qua RFC một vài lần, nó chưa bao giờ nghĩ đến hoặc làm việc với
các sợi trước đây, sẽ có thêm phản hồi sau khi tôi nắm được
chi tiết hơn

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,
bạn đã có một phần dành cho Xdebug, Parallel và pcov. Nhưng mà
điều này ảnh hưởng như thế nào đến Trình cấu hình quản lý chồng khung của riêng họ,
tất cả các cuộc gọi chức năng hoặc những cuộc gọi được chọn cụ thể. Tôi. e. xhprof,
thủy triều, datadog, newrelic, v.v.

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
khung". Với Sợi cho mỗi sợi phải mở ngăn xếp mới

Tiện ích mở rộng có biết sợi "hoạt động" là gì để từ
zend_execute_data Tôi biết tôi cần đẩy một khung hình mới vào ngăn xếp nào đang mở
khung?

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
có hoạt động về mặt zend_execute_data "tiếp theo" và "trước đó" được chạy không?
Điều này cũng sẽ rất thú vị để hiểu cách hoạt động của dấu vết ngăn xếp, vì
ví dụ debug_print_backtrace

--

Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php

của Aaron Piotrowski — xem nguồn

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
thông qua RFC một vài lần, nó chưa bao giờ nghĩ đến hoặc làm việc với
các sợi trước đây, sẽ có thêm phản hồi sau khi tôi nắm được
chi tiết hơn

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,
bạn đã có một phần dành cho Xdebug, Parallel và pcov. Nhưng mà
điều này ảnh hưởng như thế nào đến Trình cấu hình quản lý chồng khung của riêng họ,
tất cả các cuộc gọi chức năng hoặc những cuộc gọi được chọn cụ thể. Tôi. e. xhprof,
thủy triều, datadog, newrelic, v.v.

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
khung". Với Sợi cho mỗi sợi phải mở ngăn xếp mới

Tiện ích mở rộng có biết sợi "hoạt động" là gì để từ
zend_execute_data Tôi biết tôi cần đẩy một khung hình mới vào ngăn xếp nào đang mở
khung?

Bốn chức năng hiện được cung cấp để xác định sợi thực thi hiện tại

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()

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
ID sợi là duy nhất cho quy trình và không bao giờ được sử dụng lại, vì vậy nó có thể được sử dụng để xác định khung ngăn xếp mở nào sẽ đẩy khung

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
có hoạt động về mặt zend_execute_data "tiếp theo" và "trước đó" được chạy không?
Điều này cũng sẽ rất thú vị để hiểu cách hoạt động của dấu vết ngăn xếp, vì
ví dụ debug_print_backtrace

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,
Aaron Piotrowski

của Levi Morrison thông qua nội bộ — xem nguồn

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
thông qua RFC một vài lần, nó chưa bao giờ nghĩ đến hoặc làm việc với
các sợi trước đây, sẽ có thêm phản hồi sau khi tôi nắm được
chi tiết hơn

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,
bạn đã có một phần dành cho Xdebug, Parallel và pcov. Nhưng mà
điều này ảnh hưởng như thế nào đến Trình cấu hình quản lý chồng khung của riêng họ,
tất cả các cuộc gọi chức năng hoặc những cuộc gọi được chọn cụ thể. Tôi. e. xhprof,
thủy triều, datadog, newrelic, v.v.

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
khung". Với Sợi cho mỗi sợi phải mở ngăn xếp mới

Tiện ích mở rộng có biết sợi "hoạt động" là gì để từ
zend_execute_data Tôi biết tôi cần đẩy một khung hình mới vào ngăn xếp nào đang mở
khung?

Bốn chức năng hiện được cung cấp để xác định sợi thực thi hiện tại

zend_fiber *zend_get_root_fiber()
zend_fiber *zend_get_current_fiber()
zend_long zend_fiber_get_id(zend_fiber *fiber)
zend_long zend_fiber_get_current_id()

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
ID sợi là duy nhất cho quy trình và không bao giờ được sử dụng lại, vì vậy nó có thể được sử dụng để xác định khung ngăn xếp mở nào sẽ đẩy khung

Tôi nghĩ có lẽ sẽ thuận lợi nếu có một người quan sát
thông báo cho các bên quan tâm khi cáp quang chuyển mạch. Bằng cách này chúng ta có thể
tránh truy vấn cáp quang hiện tại trên mỗi fcall

của Aaron Piotrowski — xem nguồn

chưa đọc

Tôi nghĩ có lẽ sẽ thuận lợi nếu có một người quan sát
thông báo cho các bên quan tâm khi cáp quang chuyển mạch. Bằng cách này chúng ta có thể
tránh truy vấn cáp quang hiện tại trên mỗi fcall

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,
Aaron Piotrowski

--

Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php

của Aaron Piotrowski — xem nguồn

chưa đọc

Tôi nghĩ có lẽ sẽ thuận lợi nếu có một người quan sát
thông báo cho các bên quan tâm khi cáp quang chuyển mạch. Bằng cách này chúng ta có thể
tránh truy vấn cáp quang hiện tại trên mỗi fcall

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,
Aaron Piotrowski

--

Để 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);
PHP_FIBER_API void zend_observer_fiber_switch_register(zend_observer_fiber_switch_handler handler);

Đ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à

Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
7 nếu {main} là từ hoặc đến sợi quang. Trình xử lý được gọi trước khi chuyển sang sợi quang và sau khi tạm dừng khỏi sợi quang

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,
Aaron Piotrowski

của tyson andre — xem nguồn

chưa đọc

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,
Một nhận xét nhỏ là sẽ dễ đọc các trường hợp kiểm tra phpt hơn nếu

Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
8
bao 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ỉ
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
9, v.v.
(e. g. thử nghiệm/002-ném. phpt)

Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...

Tôi không thấy trong các trường hợp thử nghiệm/rfc
Làm thế nào để các macro

Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
0/
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
1/
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
2 và macro
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
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.
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
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,
-Tyson Andre

của twosee — xem nguồn

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,
Một nhận xét nhỏ là sẽ dễ đọc các trường hợp kiểm tra phpt hơn nếu

Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
8
bao 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ỉ
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
9, v.v.
(e. g. thử nghiệm/002-ném. phpt)

Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...

Tôi không thấy trong các trường hợp thử nghiệm/rfc
Làm thế nào để các macro

Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
0/
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
1/
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
2 và macro
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
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.
Stack trace:
#0 %s(%d): {closure}()
#1 %s(%d): Loop->tick()
#2 %s(%d): Loop->run()
...
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,
-Tyson Andre

--

Để 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,
hai người

của Nikita Popov — xem nguồn

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
vào/ra không đồng bộ. Sợi tương tự như sợi chỉ, ngoại trừ sợi tồn tại bên trong
một luồng duy nhất và yêu cầu lập lịch trình hợp tác của các sợi bởi
tiến trình. Vì các sợi 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 đa xử lý hoặc phân luồng cho
đang 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
Tuy nhiên, mã sử dụng sợi để giúp giải thích và chứng minh những gì có thể
Tôi chắc chắn rằng nhiều câu hỏi và mối quan tâm sẽ phát sinh. Mong chờ
phản hồi và thảo luận

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
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à
hoan nghênh

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
khó hiểu mục đích của FiberScheduler

Hiểu biết hiện tại của tôi là FiberScheduler là một loại đặc biệt của
sợi quang mà người dùng không thể lên lịch rõ ràng -- đó là
tự động lên lịch bởi Fiber. đình chỉ () và tự động hủy lịch trình
bằng sợi. sơ yếu lý lịch () hoặc Fiber. ném(). Đó là sợi chạy giữa
sợi. ) Điều đó nghe có chính xác không?

Đ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
phân biệt với các loại sợi khác. Nếu chúng ta muốn gắn bó với cái chung
cách tiếp cận, tại sao là Fiber. đình chỉ($scheduler) không phải Fiber. transferTo($sợi),
trong đó $fiber sẽ là sợi đóng vai trò là bộ lập lịch (nhưng nếu không thì
Sợi thông thường)?
các sợi sẽ biểu cảm nhất và tạo ra giao diện nhỏ nhất

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
hiệu quả trở thành sợi lập lịch. Nếu tôi hiểu đúng, lý do
tại sao bạn không muốn sử dụng phương pháp đó, là nó không cho phép bạn
gọi một số hàm AMP từ sợi {main}, tạo bộ lập lịch ở đó
và sau đó xử lý {main} giống như bất kỳ sợi nào khác. Đúng không?

Trân trọng,
nikita

của Niklas Keller — xem nguồn

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à
hoan nghênh

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
khó hiểu mục đích của FiberScheduler

Hiểu biết hiện tại của tôi là FiberScheduler là một loại đặc biệt của
sợi quang mà người dùng không thể lên lịch rõ ràng -- đó là
tự động lên lịch bởi Fiber. đình chỉ () và tự động hủy lịch trình
bằng sợi. sơ yếu lý lịch () hoặc Fiber. ném(). Đó là sợi chạy giữa
sợi. ) Điều đó nghe có chính xác không?

Vâng, đó là chính xác. Sợi được sử dụng cho đa tác vụ hợp tác và
thường có một bộ lập lịch duy nhất chịu trách nhiệm lên lịch. Nhiều
lịch trình sẽ chặn lẫn nhau hoặc chờ đợi bận rộn. Vì vậy, có nhiều
bộ lập lịch không được khuyến khích mạnh mẽ trong các ứng dụng chạy dài, tuy nhiên,
nó có thể được chấp nhận trong các ứng dụng truyền thống, tôi. e. PHP-FPM. Trong
PHP-FPM, nhiều bộ lập lịch chặn nhau một phần vẫn tốt hơn
hơn là chặn hoàn toàn mọi hoạt động I/O

Đ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
phân biệt với các loại sợi khác. Nếu chúng ta muốn gắn bó với cái chung
cách tiếp cận, tại sao là Fiber. đình chỉ($scheduler) không phải Fiber. transferTo($sợi),
trong đó $fiber sẽ là sợi đóng vai trò là bộ lập lịch (nhưng nếu không thì
Sợi thông thường)?
các sợi sẽ biểu cảm nhất và tạo ra giao diện nhỏ nhất

Có một vài lý do để tạo sự khác biệt ở đây

  • SchedulerFibers được chạy đến khi hoàn thành ở cuối tập lệnh, đây không phải là trường hợp
    cho sợi thông thường
  • Sợi kết thúc cần một sợi để quay trở lại. Đối với người lập lịch trình, thật tốt nếu
    một sợi được nối lại kết thúc, đối với các sợi thông thường, nó sẽ là một ngoại lệ nếu
    sợi quang của bộ lập lịch kết thúc mà không tiếp tục lại một cách rõ ràng
    chất xơ
  • Giữ sợi quang trước đó cho mỗi điểm treo là phức tạp nếu
    không phải là không thể để có được đúng và thường làm phức tạp việc thực hiện
    và tải nhận thức, xem ví dụ sau

chính -> A -> B -> C -> A (chấm dứt) -> C (trước đó) -> B (chấm dứt) ->
C (trước, chấm dứt) -> chính

Trong ví dụ trên, danh sách liên kết quang trước đó từ C trở lại chính
cần được tối ưu hóa tại một số điểm, nếu không thì A và B cần được giữ nguyên
bộ nhớ và do đó rò rỉ bộ nhớ cho đến khi C được tiếp tục

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
sợi gốc (cái nối lại() nó). Ở đây, sợi gốc
hiệu quả trở thành sợi lập lịch. Nếu tôi hiểu đúng, lý do
tại sao bạn không muốn sử dụng phương pháp đó, là nó không cho phép bạn
gọi một số hàm AMP từ sợi {main}, tạo bộ lập lịch ở đó
và sau đó xử lý {main} giống như bất kỳ sợi nào khác. Đúng không?

Đú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
bên bắt đầu / nối lại trước đó chịu trách nhiệm nối lại sợi quang
thay vì sợi có thể "chọn" bộ lập lịch cho một cụ thể
điểm treo. Do đó, một sợi quang sẽ được giới hạn hiệu quả trong một
Người lập kế hoạch

Tốt,
Niklas

của Nikita Popov — xem nguồn

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à
hoan nghênh

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
khó hiểu mục đích của FiberScheduler

Hiểu biết hiện tại của tôi là FiberScheduler là một loại đặc biệt của
sợi quang mà người dùng không thể lên lịch rõ ràng -- đó là
tự động lên lịch bởi Fiber. đình chỉ () và tự động hủy lịch trình
bằng sợi. sơ yếu lý lịch () hoặc Fiber. ném(). Đó là sợi chạy giữa
sợi. ) Điều đó nghe có chính xác không?

Vâng, đó là chính xác. Sợi được sử dụng cho đa tác vụ hợp tác và
thường có một bộ lập lịch duy nhất chịu trách nhiệm lên lịch. Nhiều
lịch trình sẽ chặn lẫn nhau hoặc chờ đợi bận rộn. Vì vậy, có nhiều
bộ lập lịch không được khuyến khích mạnh mẽ trong các ứng dụng chạy dài, tuy nhiên,
nó có thể được chấp nhận trong các ứng dụng truyền thống, tôi. e. PHP-FPM. Trong
PHP-FPM, nhiều bộ lập lịch chặn nhau một phần vẫn tốt hơn
hơn là chặn hoàn toàn mọi hoạt động I/O

Đ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
phân biệt với các loại sợi khác. Nếu chúng ta muốn gắn bó với cái chung
cách tiếp cận, tại sao là Fiber. đình chỉ($scheduler) không phải Fiber. transferTo($sợi),
trong đó $fiber sẽ là sợi đóng vai trò là bộ lập lịch (nhưng nếu không thì
Sợi thông thường)?
các sợi sẽ biểu cảm nhất và tạo ra giao diện nhỏ nhất

Có một vài lý do để tạo sự khác biệt ở đây

  • SchedulerFibers được chạy đến khi hoàn thành ở cuối tập lệnh, đây không phải là
    trường hợp cho sợi bình thường
  • Sợi kết thúc cần một sợi để quay trở lại. Đối với người lên lịch thì không sao
    nếu một sợi được nối lại kết thúc, thì đối với các sợi thông thường, đó phải là một ngoại lệ
    nếu sợi quang của bộ lập lịch kết thúc mà không tiếp tục lại một cách rõ ràng
    chất xơ
  • Giữ sợi quang trước đó cho mỗi điểm treo là phức tạp nếu
    không phải là không thể để có được đúng và thường làm phức tạp việc thực hiện
    và tải nhận thức, xem ví dụ sau

chính -> A -> B -> C -> A (chấm dứt) -> C (trước đó) -> B (chấm dứt) ->
C (trước, chấm dứt) -> chính

Trong ví dụ trên, danh sách liên kết quang trước đó từ C trở lại chính
cần được tối ưu hóa tại một số điểm, nếu không thì A và B cần được giữ nguyên
bộ nhớ và do đó rò rỉ bộ nhớ cho đến khi C được tiếp tục

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
sự kết hợp của cả hai sẽ làm việc?
Chất xơ. Suspension () trở lại sợi gốc và tạo sợi gốc
chấm dứt trong khi vẫn có con một điều kiện lỗi. Ngoài ra,
bạn cung cấp một cái gì đó như Fiber. runAsParent() để cho phép "áp dụng" một sợi quang
dưới cấp độ gốc mới, đóng vai trò là bộ lập lịch (điều này bao hàm {main}
-> trường hợp sử dụng bộ lập lịch)

Nếu bạn trung thành với khái niệm FiberScheduler, thì bạn có thể muốn xem xét
đảo ngược API. Ngay bây giờ, về cơ bản, bạn đang sử dụng API Fiber tiêu chuẩn,
với sự khác biệt là Suspension() chấp nhận FiberScheduler, đó là
không trực quan với tôi. Nếu Fibers vẫn yêu cầu một bộ lập lịch, thì tại sao
tạm dừng và tiếp tục các phương pháp không có trên bộ lập lịch?

lớp FiberScheduler {
đình chỉ chức năng (Sợi $ sợi);
bắt đầu chức năng(Sợi $sợi);
sơ yếu lý lịch chức năng(Fiber $fiber);
}

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
một bộ lập lịch nhất định, trong khi "tiếp tục" tiếp tục một sợi sao cho nó sẽ
quay lại bộ lập lịch này khi chấm dứt. Điều này cũng làm cho nó nhiều hơn
rõ ràng là, chẳng hạn, không thể chỉ thực hiện "$fiber->start()"
mà không cần tạo bộ lập lịch trước (mặc dù nó không làm cho nó
rõ ràng là cuộc gọi phải từ bên trong bộ lập lịch)

Trân trọng,
nikita

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
hiệu quả trở thành sợi lập lịch. Nếu tôi hiểu đúng, lý do
tại sao bạn không muốn sử dụng phương pháp đó, là nó không cho phép bạn
gọi một số hàm AMP từ sợi {main}, tạo bộ lập lịch ở đó
và sau đó xử lý {main} giống như bất kỳ sợi nào khác. Đúng không?

Đú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 bên bắt đầu / nối lại trước đó chịu trách nhiệm nối lại
sợi thay vì sợi có thể "chọn" bộ lập lịch cho một
điểm treo cụ thể. Do đó, một sợi sẽ được giới hạn hiệu quả trong một
lịch trình duy nhất

Tốt,
Niklas

của Aaron Piotrowski — xem nguồn

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
đảo ngược API. Ngay bây giờ, về cơ bản, bạn đang sử dụng API Fiber tiêu chuẩn,
với sự khác biệt là Suspension() chấp nhận FiberScheduler, đó là
không trực quan với tôi. Nếu Fibers vẫn yêu cầu một bộ lập lịch, thì tại sao
tạm dừng và tiếp tục các phương pháp không có trên bộ lập lịch?

lớp FiberScheduler {
đình chỉ chức năng (Sợi $ sợi);
bắt đầu chức năng(Sợi $sợi);
sơ yếu lý lịch chức năng(Fiber $fiber);
}

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
một bộ lập lịch nhất định, trong khi "tiếp tục" tiếp tục một sợi sao cho nó sẽ
quay lại bộ lập lịch này khi chấm dứt. Điều này cũng làm cho nó nhiều hơn
rõ ràng là, chẳng hạn, không thể chỉ thực hiện "$fiber->start()"
mà không cần tạo bộ lập lịch trước (mặc dù nó không làm cho nó
rõ ràng là cuộc gọi phải từ bên trong bộ lập lịch)

Trân trọng,
nikita

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

use namespace HH\Asio;

async function async_task(): Awaitable {
  await Asio\usleep(1000000);
}

<<__EntryPoint>>
function main(): void {
  $start = microtime(true);

  $async = async {
    concurrent {
      await async_task();
      await async_task();
    };

    return 'hello';
  };

  $result = Asio\join($async);

  printf('Result: %s ( %f )', $result, microtime(true) - $start); // output "Result: hello ( 1.010382 )"
}

2, nhưng tôi nghĩ rằng điều đó làm tăng thêm độ phức tạp mà không đạt được nhiều. Theo tôi,
use namespace HH\Asio;

async function async_task(): Awaitable {
  await Asio\usleep(1000000);
}

<<__EntryPoint>>
function main(): void {
  $start = microtime(true);

  $async = async {
    concurrent {
      await async_task();
      await async_task();
    };

    return 'hello';
  };

  $result = Asio\join($async);

  printf('Result: %s ( %f )', $result, microtime(true) - $start); // output "Result: hello ( 1.010382 )"
}

3 kém trực quan hơn
use namespace HH\Asio;

async function async_task(): Awaitable {
  await Asio\usleep(1000000);
}

<<__EntryPoint>>
function main(): void {
  $start = microtime(true);

  $async = async {
    concurrent {
      await async_task();
      await async_task();
    };

    return 'hello';
  };

  $result = Asio\join($async);

  printf('Result: %s ( %f )', $result, microtime(true) - $start); // output "Result: hello ( 1.010382 )"
}

4. Một trong hai sẽ phải được gọi trong cuộc gọi lại được cung cấp cho hàm tạo FiberScheduler

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

Đ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
phân biệt với các loại sợi khác. Nếu chúng ta muốn gắn bó với cái chung
cách tiếp cận, tại sao là Fiber. đình chỉ($scheduler) không phải Fiber. transferTo($sợi),
trong đó $fiber sẽ là sợi đóng vai trò là bộ lập lịch (nhưng nếu không thì
Sợi thông thường)?
các sợi sẽ biểu cảm nhất và tạo ra giao diện nhỏ nhất

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,
Aaron Piotrowski

của twosee — xem nguồn

chưa đọc

2020年12月18日 上午12. 30,Aaron Piotrowski aaron@trowski. com 写道:

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

Aaron Piotrowski

Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php

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ư

use namespace HH\Asio;

async function async_task(): Awaitable {
  await Asio\usleep(1000000);
}

<<__EntryPoint>>
function main(): void {
  $start = microtime(true);

  $async = async {
    concurrent {
      await async_task();
      await async_task();
    };

    return 'hello';
  };

  $result = Asio\join($async);

  printf('Result: %s ( %f )', $result, microtime(true) - $start); // output "Result: hello ( 1.010382 )"
}

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,
hai người

của Aaron Piotrowski — xem nguồn

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

Aaron Piotrowski

Để hủy đăng ký, hãy truy cập. https. //www. php. mạng/hủy đăng ký. php

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
Aaron Piotrowski

của Mark Randall — xem nguồn

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
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 để thúc đẩy mọi người sử dụng cái này
chức năng, chỉ phải viết lại nó 1 hoặc 2 năm sau vì một
cơ chế cú pháp vượt trội đã được giới thiệu

Nếu bạn có thể thêm async/await/delay/defer, ngay cả khi nó mất một
tháng hoặc lâu hơn, điều đó có thể làm cho RFC này lớn hơn đáng kể
và tác động có lợi hơn đối với người dùng

Đánh dấu Randall

của Aaron Piotrowski — xem nguồn

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,
Aaron Piotrowski

của Aaron Piotrowski — xem nguồn

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

Việc sử dụng ReactPHP là gì?

ReactPHP là thư viện cấp thấp dành cho lập trình hướng sự kiện trong PHP . Cốt lõi của nó là một vòng lặp sự kiện, trên hết nó cung cấp các tiện ích cấp thấp, chẳng hạn như. Trừu tượng hóa luồng, trình phân giải DNS không đồng bộ, máy khách/máy chủ mạng, máy khách/máy chủ HTTP và tương tác với các quy trình.

Làm cách nào để sử dụng async trong PHP?

Để viết chương trình Async bằng PHP, chúng ta cần thư viện (ReactPHP và Amp) được sử dụng để triển khai non-blocking I/O trong php. AMP is a concurrency framework for php and allows us to manage event loops, async iterators, and promises.