سؤال

وليس لدي <م> stackless قيد التشغيل حاليا، لذلك لا أستطيع أن يحاول هذا بنفسي.

import stackless
ch1 = stackless.channel()
ch2 = stackless.channel()

ch1.send(ch2)
ch3 = ch1.receive()

هل <م> CH2 و <م> CH3 ثم نفس القناة؟ يقول:

text = "Hallo"
ch2.send(text)
assert text == ch3.receive()

وذكرت هذه الميزة لي من حول Newsqueak أن روبرت بيك (من < وأ href = "http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs" يختلط = "نوفولو noreferrer"> Plan9 على الشهرة) وقدم في جوجل. في Newsqueak هل يمكن أن ترسل عبر قنوات قنوات.

هل كانت مفيدة؟

المحلول

نعم. مجرد اختبار.

>>> import stackless
>>> ch1 = stackless.channel()
>>> def a():
...  ch2 = stackless.channel()
...  ch1.send(ch2)
...  ch2.send("Hello")
...
>>> def b():
...  ch3 = ch1.receive()
...  print ch3.receive()
...
>>> stackless.tasklet(a)()
<stackless.tasklet object at 0x01C6FCB0>
>>> stackless.tasklet(b)()
<stackless.tasklet object at 0x01C6FAB0>
>>> stackless.run()
Hello

نصائح أخرى

والقنوات ترسل إشارات بيثون العادية حتى البيانات التي ترسلها (قناة، سلسلة، أيا كان) هو بالضبط ما حصل.

وأحد الأمثلة على ارسال قناة عبر قناة هو عند استخدام tasklet كخدمة، وهذا هو، وtasklet يستمع على قناة لطلبات، لا عمل، وإرجاع النتيجة. يحتاج الطلب لتشمل البيانات للعمل وقناة عودة للنتيجة، بحيث يذهب النتيجة إلى الطالب.

إليك مثالا صارخا أنا وضعت لبلدي الحديث Stackless في PyCon قبل بضع سنوات. وهذا يخلق tasklet جديد لكل استدعاء دالة حتى أتمكن من استخدام تطبيق العودية مضروب التي لا داعي للقلق بشأن الحد كومة بايثون. I تخصيص tasklet عن كل مكالمة، وأنه يحصل على قناة عودة للنتيجة.

import stackless 

def call_wrapper(f, args, kwargs, result_ch): 
    result_ch.send(f(*args, **kwargs)) 
    # ... should also catch and forward exceptions ... 

def call(f, *args, **kwargs): 
    result_ch = stackless.channel() 
    stackless.tasklet(call_wrapper)(f, args, kwargs, result_ch) 
    return result_ch.receive() 

def factorial(n): 
    if n <= 1: 
        return 1 
    return n * call(factorial, n-1) 

print "5! =", factorial(5) 
print "1000! / 998! =", factorial(1000)/factorial(998)

والإخراج هو:

5! = 120 
1000! / 998! = 999000

ولدي بعض الأمثلة الأخرى من إرسال القنوات عبر قنوات في العرض الذي قدمته. إنه لأمر شائع في Stackless.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top