2016-09-24 24 views
16

Hỗ trợ cho coroutines ở Lua được cung cấp bởi functions in the coroutine table, chủ yếu là create, resumeyield. Các nhà phát triển mô tả các coroutines này là stackful, first-class and asymmetric.Làm thế nào để coroutines trong Python so sánh với những người trong Lua?

Coroutines cũng có sẵn bằng Python, hoặc sử dụng enhanced generators (và yield from) hoặc, được thêm vào trong phiên bản 3.5, async and await.

Làm thế nào để coroutines trong Python so sánh với những người ở Lua? Họ cũng xếp chồng lên nhau, hạng nhất và không đối xứng?

Tại sao Python đòi hỏi rất nhiều cấu trúc (async def, async with, async for, asynchronous comprehensions ...) cho coroutines, trong khi Lua có thể cung cấp cho họ với chỉ ba chức năng built-in?

+0

suy đoán cá nhân về việc tại sao python đòi hỏi rất nhiều cấu trúc: nó đã được giới thiệu sang ngôn ngữ khá gần đây và cần thiết để thích ứng với hoạt động xây dựng tắt của đã các cú pháp hiện có (thêm 'async' vào các câu lệnh khác) Ngoài ra bạn dường như đã liên kết với nhiều tài nguyên giải thích cách các cấu trúc khác nhau hoạt động - câu hỏi của bạn không được tài liệu trả lời? –

+0

Tôi không biết làm thế nào corthon corthon hoạt động, nhưng nếu bạn cần trợ giúp với Lua coroutines tôi có sẵn :) – warspyking

+0

[Đây là] (http://sahandsaba.com/understanding-asyncio-node-js-python-3- 4.html) một bài viết tốt trên asyncio python nếu kinda dài quanh co ... Đối với Lua, tôi luôn nghĩ [Tài liệu] (https://www.lua.org/pil/9.1.html) được viết khá tốt – Aaron

Trả lời

0

Tôi vừa có cái nhìn đầu tiên tại lua, bao gồm sieve.lua live demo. Nó là một thực hiện của rây của Erathostenes bằng cách sử dụng coroutines. suy nghĩ trước mắt của tôi là: Đây sẽ trông sạch hơn nhiều trong python:

#!/usr/bin/env python3 

# sieve.py 
# the sieve of Eratosthenes programmed with a generator functions 
# typical usage: ./sieve.py 500 | column 

import sys 

# generate all the numbers from 2 to n 
def gen(n): 
    for i in range(2,n): 
     yield i 

# filter the numbers generated by `g', removing multiples of `p' 
def filter(p, g): 
    for n in g: 
     if n%p !=0: 
      yield n 

N=int(sys.argv[1]) if len(sys.argv)>1 else 500 # from command line 
x=gen(N)      # generate primes up to N 
while True: 
    try: 
     n = next(x)   # pick a number until done 
    except StopIteration: 
     break 
    print(n)     # must be a prime number 
    x = filter(n, x)   # now remove its multiples 

này không có nhiều việc phải làm với các câu hỏi, nhưng trên máy tính của tôi sử dụng Python 3.4.3 một chồng tràn xảy ra ở đâu đó cho N>7500. Sử dụng sieve.lua với Lua 5.2.3 tràn ngăn xảy ra tại N>530.

Đối tượng máy phát (đại diện cho một coroutin lơ lửng) có thể được truyền xung quanh giống như bất kỳ đối tượng nào khác và tiếp theo() có thể được áp dụng cho nó ở bất kỳ nơi nào, vì vậy coroutines trong python là hạng nhất. Hãy sửa tôi nếu tôi sai.

+0

Có , Tôi biết rằng việc xác định hàm 'gen (x)' là không cần thiết, bởi vì 'x = gen (N)' có thể được thay thế bởi 'x = iter (phạm vi (2, N))'. Tôi muốn được gần 'sieve.lua'. – Sunday

+0

Sự tràn ngăn xếp có thể dễ dàng được cố định bằng cách tăng cường 'LUAI_MAXCCALLS' trong [llimits.h] (https://www.lua.org/source/5.3/llimits.h.html#LUAI_MAXCCALLS). – greatwolf

1

Câu trả lời đơn giản là chúng là các ngôn ngữ khác nhau. Có, Python coroutines là stackful, hạng nhất và không đối xứng. Xem câu trả lời này: Coroutine vs Continuation vs Generator

Từ Lua documentation:

Một số người gọi không đối xứng coroutine bán coroutines (vì họ không đối xứng, họ không thực sự đồng). Tuy nhiên, những người khác sử dụng cùng một thuật ngữ nửa coroutine để biểu thị việc triển khai hạn chế coroutines, trong đó coroutine chỉ có thể tạm ngưng thực thi khi nó không nằm trong bất kỳ chức năng phụ trợ nào, nghĩa là khi không có cuộc gọi đang chờ xử lý ngăn xếp điều khiển của nó. Nói cách khác, chỉ có cơ thể chính của bán coroutine như vậy có thể mang lại. Một máy phát điện bằng Python là một ví dụ về ý nghĩa của bán coroutine này.

Không giống như sự khác biệt giữa đối xứng và đối xứng coroutines, sự khác biệt giữa coroutines và máy phát điện (như được trình bày bằng Python) là một sâu; máy phát điện chỉ đơn giản là không đủ mạnh để thực hiện một số công trình thú vị mà chúng ta có thể viết với các coroutine đúng . Lua cung cấp đúng, bất đối xứng coroutines. Những người thích coroutines đối xứng có thể thực hiện chúng trên đầu trang của bất đối xứng cơ sở của Lua. Đó là một nhiệm vụ dễ dàng. (Về cơ bản, mỗi lần chuyển nhượng sẽ thực hiện một lợi nhuận theo sau một bản lý lịch.)

Ngoài ra, xem thảo luận này trong danh sách phát triển email của Python: PEP 492: What is the real goal?

Các vấn đề liên quan