Source code for mciwb.threads
"""
Functions to manage threads.
Each thread maintains its own Client object for parallel execution of Minecraft
Server functions. The 1st Client object is created on the main thread and then
passed to new_thread.
"""
import threading
from mcipc.rcon.je.client import Client
thread_local = threading.local()
def _enter_thread(client, target, name):
# make new client connection for this thread
# Note use of type(client). When testing the type may be MockClient
# TODO would prefer to use a context for client here as the cleanup
# works - but it gets an error running under PyTest (huh?)
new_client = type(client)(client.host, client.port, passwd=client.passwd)
new_client.connect(True)
set_client(new_client)
target()
[docs]
def new_thread(client: Client, target, name: str) -> threading.Thread:
"""
Create a thread with its own RCON Client connection stored in thread local storage
"""
# Start a new thread and use _enter_thread to set it up with a new RCON client
new_thread = threading.Thread(target=_enter_thread, args=(client, target, name))
new_thread.start()
return new_thread
[docs]
def set_client(client: Client) -> None:
"""
Set the client for this thread. Use this when the client object has been
created outside of `new_thread`.
"""
# save our new client in the thread local storage
thread_local.client = client
[docs]
def get_client() -> Client:
"""
retrieve the client for the current thread
"""
return thread_local.client
[docs]
def get_thread_name() -> str:
"""
retrieve the name of the current thread. This is the name that was passed
to `new_thread`.
"""
return thread_local.name