fail_switch_three_greenlets2.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. """
  2. Like fail_switch_three_greenlets, but the call into g1_run would actually be
  3. valid.
  4. """
  5. import greenlet
  6. g1 = None
  7. g2 = None
  8. switch_to_g2 = True
  9. results = []
  10. def tracefunc(*args):
  11. results.append(('trace', args[0]))
  12. print('TRACE', *args)
  13. global switch_to_g2
  14. if switch_to_g2:
  15. switch_to_g2 = False
  16. g2.switch('g2 from tracefunc')
  17. print('\tLEAVE TRACE', *args)
  18. def g1_run(arg):
  19. results.append(('g1 arg', arg))
  20. print('In g1_run')
  21. from_parent = greenlet.getcurrent().parent.switch('from g1_run')
  22. results.append(('g1 from parent', from_parent))
  23. return 'g1 done'
  24. def g2_run(arg):
  25. #g1.switch()
  26. results.append(('g2 arg', arg))
  27. parent = greenlet.getcurrent().parent.switch('from g2_run')
  28. global switch_to_g2
  29. switch_to_g2 = False
  30. results.append(('g2 from parent', parent))
  31. return 'g2 done'
  32. greenlet.settrace(tracefunc)
  33. g1 = greenlet.greenlet(g1_run)
  34. g2 = greenlet.greenlet(g2_run)
  35. x = g1.switch('g1 from main')
  36. results.append(('main g1', x))
  37. print('Back in main', x)
  38. x = g1.switch('g2 from main')
  39. results.append(('main g2', x))
  40. print('back in amain again', x)
  41. x = g1.switch('g1 from main 2')
  42. results.append(('main g1.2', x))
  43. x = g2.switch()
  44. results.append(('main g2.2', x))
  45. print("RESULTS:", results)