Jump to content
CBAPKA

Async script with PythonThread

Recommended Posts

Posted (edited)

Is there any way I can run the script without the main thread hanging? I can run the code in a stream, but I don't understand how it works to the end, because I can execute the code in PyCharm and everything works fine. For example, I initialize the stream directly inside the python script, put the code into it, but the Library telethon that performs the task throws the error "There is no current event loop" или "There is no current event loop in thread 'Thread-1 (main)'." или "There is no current event loop in thread 'Dummy-1'." In pycharm that work as

 

def CreateConnect(path: str, proxy, api_hash, api_id, device=None, system=None, loop=None):
    TC = TelegramClient(
        api_hash=api_hash,
        api_id=api_id,
        session=path,
        timeout=60,
        device_model=device,
        system_version=system,
        proxy=proxy,
        loop=loop
    )
    try:
        TC.connect()
        if TC.is_connected():
            return TC
        else:
            return False
    except Exception as e:
        print(f'error {path}: {e}')
        return False

def main(loop):
    asyncio.set_event_loop(loop)
    #...
    tg = CreateConnect(path=f'{accPath}\\{account}\\telethon.session',
                       proxy=proxy,
                       api_hash=settings['telethon']['api_hash'],
                       api_id=settings['telethon']['api_id'],
                       device=settings['telethon']['device_model'],
                       system=settings['telethon']['system_version'],
                       loop=loop
                      )

if __name__ == '__main__':
    loop = asyncio.new_event_loop()
    p = threading.Thread(target=main, args=(loop,))
    p.start()

but in delphi, the Thread is initialized on top of the module, as I understood it

Edited by CBAPKA

Share this post


Link to post
1 hour ago, pyscripter said:

which explains how to run python code in delphi threads.  This keeps the delphi main thread from blocking.

 

I read it, but my problem in this:

GetPythonEngine.ExecStrings(Lines);

Lines:

import asyncio
loop = asyncio.new_event_loop ()

and got error:

ValueError: set_wakeup_fd only works in main thread of the main interpreter

my task is just to run asynchronous code in python, without hanging the delphi interface itself, but it turns out that pythonThread From delphi Wraps the script into a thread and I do not know how to get the Loop of the Main thread

Share this post


Link to post
Posted (edited)

Assuming you are on Windows use:

import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
loop = asyncio.new_event_loop()

This should work both in the main thread and in other threads.

 

Google for "set_wakeup_fd" to see this is a well known issue.

Edited by pyscripter

Share this post


Link to post
1 hour ago, pyscripter said:

Assuming you are on Windows use:

Thank you very much. You have solved my problem.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×