Join us and we need to process a series of single digits (0~9). If it is an odd number, we need to loop to print it; if it is an even number, wait for the corresponding time and complete all tasks; if it is 0 It is an error, but there is no need to terminate the task and some processing can be customized.
Define funcFunctionProcessing requirements
Callback processing returns results, only even numbers and 0 are returned; odd numbers will always be executed; thread control is required Pool status , you need to throw an exception for even numbers and 0, and capture exception handling .
threadpool defines thread pool concurrency
# -*- coding: utf-8 -*- from threadpool import makeRequests, ThreadPool import time from multiprocessing import Process
class Finish(SyntaxWarning): pass
class PauseInfo(SyntaxWarning): pass pause_num = 0
Returns False when 0, returns True for other even numbers
def func(para): if para == pause_num: print('start for %d and wait %ds' % (para, 4)) time.sleep(4) print('error bcs ',para) return False if para % 2 == 0: print('start for %d and wait %ds' % (para, para)) time.sleep(para) print('stop for', para) return True while True: print('continue for', para) time.sleep(para)
def callback(request, result): if result: raise Finish else: raise PauseInfo
Finish marks the completion of the task, and induces an exception again to exit the thread pool processing;
def main_thread(paras): pool = ThreadPool(10) requests = makeRequests(callable_=func, args_list=paras, callback=callback) [pool.putRequest(req) for req in requests] while True: try: pool.wait() except Finish as e: raise SystemExit except PauseInfo as e: print('Pause bcs %d but will continue' % pause_num) except Exception as e: print('Unknown error so will quit') raise SystemExit
if name == 'main': while True: s = input('Input number list to test and any other word to quit\n') paras = [] for para in s: if para.isnumeric(): paras.append(int(para)) else: break try: thread_test = Process(target=main_thread, args=(paras,)) thread_test.start() thread_test.join(timeout=20) except TimeoutError as e: print('task timeout') except Exception as e: print('unknow error:',e)
Processing 108, you can see from the print that 1 is processed in a loop, and an error is reported when 0 is processed; 8 is processed and the task End
Input number list to test and any other word to quit
108
continue for 1
start for 0 and wait 4s
start for 8 and wait 8s
continue for 1
continue for 1
continue for 1
error bcs 0
continue for 1
Pause bcs 0 but will continue
continue for 1
continue for 1
continue for 1
continue for 1
stop for 8
Input number list to test and any other word to quit
The above is the detailed content of Detailed explanation of Threadpool thread pool task termination sample code in python. For more information, please follow other related articles on the PHP Chinese website!