coderelliot
coderelliot

Reputation: 501

How to specify a part of code to run in a particular thread in a multithreaded environment in python?

How to achieve something like:

def call_me():
   # doing some stuff which requires distributed locking

def i_am_calling():
   # other logic
   call_me()
   # other logic

This code runs in a multithreaded environment. How can I make it something like, only a single thread from the thread pool has responsibility to run call_me() part of the i_am_calling()?

Upvotes: 0

Views: 564

Answers (1)

Karthik Balaguru
Karthik Balaguru

Reputation: 7852

It depends on the exact requirement in hand and on the system architecture / solution. Accordingly, one of the approach can be based on lock to ensure that only one process does the locking at a time.

You can arrive on logic by trying usage of apply_async of the multiprocessing module that could enable invocation of a number of different functions (not of same type of function) with pool.apply_async. It shall use only one process when that function is invoked only once, however you can bundle up tasks ahead and pass/submit these tasks to the various worker processes. There is also the pool.apply that submits a task to the pool , but it blocks until the function is completed or result is available. The equivalent of it is pool.apply_async(func, args, kwargs).get() based on get() or a callback function with pool.apply_async without get(). Also, it should be noted that pool.apply(f, args) ensures that only one of the workers of the pool will execute f(args).

You can also arrive on logic by trying of making a respective call in its own thread using executor.submit that is part of concurrent.futures which is a standard Python library . The asyncio can be coupled with concurrent.futures such that it can await functions executed in thread or process pools provided by concurrent.futures as highlighted in this example.

If you would like to run a routine functionality at regular interval, then you can arrive on a logic based on threading.timer.

Upvotes: 1

Related Questions