في بيثون stackless، يمكنك إرسال القناة عبر قناة؟
-
10-07-2019 - |
سؤال
وليس لدي <م> 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.