PHP 8.3.31
Preview: fail_initialstub_already_started.py Size: 1.92 KB
/opt/hc_python/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py

"""
Testing initialstub throwing an already started exception.
"""

import greenlet

a = None
b = None
c = None
main = greenlet.getcurrent()

# If we switch into a dead greenlet,
# we go looking for its parents.
# if a parent is not yet started, we start it.

results = []

def a_run(*args):
    #results.append('A')
    results.append(('Begin A', args))


def c_run():
    results.append('Begin C')
    b.switch('From C')
    results.append('C done')

class A(greenlet.greenlet): pass

class B(greenlet.greenlet):
    doing_it = False
    def __getattribute__(self, name):
        if name == 'run' and not self.doing_it:
            assert greenlet.getcurrent() is c
            self.doing_it = True
            results.append('Switch to b from B.__getattribute__ in '
                           + type(greenlet.getcurrent()).__name__)
            b.switch()
            results.append('B.__getattribute__ back from main in '
                           + type(greenlet.getcurrent()).__name__)
        if name == 'run':
            name = '_B_run'
        return object.__getattribute__(self, name)

    def _B_run(self, *arg):
        results.append(('Begin B', arg))
        results.append('_B_run switching to main')
        main.switch('From B')

class C(greenlet.greenlet):
    pass
a = A(a_run)
b = B(parent=a)
c = C(c_run, b)

# Start a child; while running, it will start B,
# but starting B will ALSO start B.
result = c.switch()
results.append(('main from c', result))

# Switch back to C, which was in the middle of switching
# already. This will throw the ``GreenletStartedWhileInPython``
# exception, which results in parent A getting started (B is finished)
c.switch()

results.append(('A dead?', a.dead, 'B dead?', b.dead, 'C dead?', c.dead))

# A and B should both be dead now.
assert a.dead
assert b.dead
assert not c.dead

result = c.switch()
results.append(('main from c.2', result))
# Now C is dead
assert c.dead

print("RESULTS:", results)

Directory Contents

Dirs: 1 × Files: 28

Name Size Perms Modified Actions
- drwxr-xr-x 2026-06-11 06:30:31
Edit Download
1.23 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
985 B lrw-r--r-- 2026-06-11 06:30:31
Edit Download
1.92 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
524 B lrw-r--r-- 2026-06-11 06:30:31
Edit Download
956 B lrw-r--r-- 2026-06-11 06:30:31
Edit Download
1.25 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
817 B lrw-r--r-- 2026-06-11 06:30:31
Edit Download
12.32 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
9.34 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
3.09 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
4.71 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
2.85 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
1.21 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
3.63 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
49.31 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
8.17 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
32.29 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
18.79 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
446 B lrw-r--r-- 2026-06-11 06:30:31
Edit Download
3.63 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
8.35 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
1.49 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
883 B lrw-r--r-- 2026-06-11 06:30:31
Edit Download
7.07 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
16.92 KB lrwxr-xr-x 2026-06-11 06:30:31
Edit Download
6.56 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download
57.35 KB lrwxr-xr-x 2026-06-11 06:30:31
Edit Download
9.51 KB lrw-r--r-- 2026-06-11 06:30:31
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).