python 非常简单的接口,用于python中多线程执行函数。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 非常简单的接口,用于python中多线程执行函数。相关的知识,希望对你有一定的参考价值。

import time

# EXAMPLE: ------------------------------------------------
def dummy_func(dum_var, arg_rec):
    if type(arg_rec) is tuple:  # important to accept various input
        arg_rec = arg_rec[0]
   
    time.sleep(1)
    print(('dum_var: %s' % dum_var))
    for arg in arg_rec:
        print(('Another arg: ', arg))


# How to run:
if __name__ == '__main__': 
    dum_list = [i for i in range(50)]  # generate some dummy data

    # test_threads = EasyThreading(dummy_func, dum_list, 10, True, True, 'I am another arg!', 'Me too.')
    test_threads = EasyThreading(dummy_func, dum_list, arg_rec=['I am another arg!', 'Me too.'], pool_size=10, verbose=True)

    # starts thread execution
    test_threads.start_all()

    time.sleep(10)
    # testing out adding additional data to queue
    new_args = [y for y in range(50, 90, 2)]
    test_threads.in_queue(new_args)

    # wait until all the threads got executed
    test_threads.join_all()
    print("Everything finished")
import threading
from queue import Queue


class EasyThreading(object):
    """
    To Process the functions in parallel

    """

    def __init__(self,
                 func,
                 data,
                 *args,  # put here to enforce keyword usage
                 pool_size=None,
                 daemon=True,
                 verbose=False,
                 **kwargs
                 ):

        """

        :type kwargs: object
        :type args: object
        """
        self.func = func
        self.data = data  # must be iterable!
        # TODO: iter check
        # https://stackoverflow.com/questions/1952464/in-python-how-do-i-determine-if-an-object-is-iterable

        # number of threads according to length of iterable, else as specified:
        if pool_size is None:
            pool_size = len(data)

        self.verbose = verbose

        self.args = args
        self.kwargs = kwargs

        # stop sign:
        self.on = True

        # setting up and filling queue:
        self.q = Queue()
        self.in_queue(self.data)

        # initializing threads:
        self.threads = [threading.Thread(target=self._threader) for _ in range(pool_size)]
        [t.setDaemon(daemon) for t in self.threads]

        self.print_lock = threading.Lock()

    def _threader(self):
        # while True:  # while loop crucial here, to process all jobs in queue
        # while not self.q.empty():  # works as long queue is not empty requires external while loop
        # while self.on:  # stop sign
        while True:
            # generating indexed thread name in the form of: func_name.thread.001:
            thread_index = int(threading.current_thread().name.split('-')[-1])
            thread_name = self.func.__name__ + '.thread.' + '{0:03d}'.format(thread_index)

            # gets a worker from the queue
            in_put = self.q.get()

            # print what thread is currently working on:
            if self.verbose:
                with self.print_lock:
                    print('{} is working on: {}'.format(thread_name, in_put))

            # run the job with the available worker in queue (thread)
            if self.args and self.kwargs:
                self.func(in_put, self.args, self.kwargs)
            elif self.args:
                self.func(in_put, self.args)
            elif self.kwargs:
                self.func(in_put, self.kwargs)
            else:
                self.func(in_put)

            # completed with the job
            self.q.task_done()
            if self.verbose:
                with self.print_lock:
                    print(('{} finished job.'.format(thread_name)))

            # ending thread:
            if not self.on:
                if self.q.empty():  # only if queue empty at same time
                    break  # <-- this one ends threads!!!

    def in_queue(self, in_arg):
        if self.on:  # accepts input as long as stop sign is not shown
            [self.q.put(a) for a in in_arg if a is not None]
        elif not self.on:
            raise Exception('No active threads.')

    def start_all(self):
        [t.start() for t in self.threads]

    def join_all(self):
        self.on = False
        [t.join() for t in self.threads]


以上是关于python 非常简单的接口,用于python中多线程执行函数。的主要内容,如果未能解决你的问题,请参考以下文章

python中多进程/多线程简单介绍

理解Python中多线程

C中多线程python扩展中的段错误

python中多模块导入的注意点

windows怎么安装python

用于制作 python 装饰器类的精益接口