ラベル Python concurrent.futures.ProcessPoolExecutor の投稿を表示しています。 すべての投稿を表示
ラベル Python concurrent.futures.ProcessPoolExecutor の投稿を表示しています。 すべての投稿を表示

2019年11月18日月曜日

Ex13ProcessPoolExecutor.py

# https://docs.python.org/ja/3/library/concurrent.futures.html?highlight=processpoolexecutor
# https://qiita.com/__init__/items/91e5841ed53d55a7895e
import concurrent.futures
import logging
# import math
import math
import os
import time
from logging import getLogger, StreamHandler, FileHandler, Formatter

PRIMES = [
    0,
    10000,
    1,
    20000,
    30000,
    2,
    40000,
    50000,
    60000,
    3,
    4,
    5,
    6,
]

def mkLogger(type, n):
    # 1.loggerの設定
    # loggerオブジェクトの宣言
    logger = getLogger(type)

    # loggerのログレベル設定(ハンドラに渡すエラーメッセージのレベル)
    logger.setLevel(logging.DEBUG)

    # 2.handlerの設定
    # ログ出力フォーマット設定
    handler_format = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    # 2-1.標準出力のhandler
    # handlerの生成
    stream_handler = StreamHandler()

    # handlerのログレベル設定(ハンドラが出力するエラーメッセージのレベル)
    stream_handler.setLevel(logging.DEBUG)

    # ログ出力フォーマット設定
    stream_handler.setFormatter(handler_format)

    # 2-2.テキスト出力のhandler
    # handlerの生成
    file_handler = FileHandler('Ex13ProcessPoolExecutor.' + type + '.log', 'a')

    # handlerのログレベル設定(ハンドラが出力するエラーメッセージのレベル)
    file_handler.setLevel(logging.DEBUG)

    # ログ出力フォーマット設定
    file_handler.setFormatter(handler_format)

    # 3.loggerにhandlerをセット
    # 標準出力のhandlerをセット
    logger.addHandler(stream_handler)
    # テキスト出力のhandlerをセット
    logger.addHandler(file_handler)

    return logger

def is_prime(n):
    print("# %s %s %s\n" % (str(os.getpid()), str(n), "start"))
    logger = mkLogger(str(n), n)
    logger.debug(str(os.getpid()) + " " + str(n) + " Start Hello World!")
    print("# %s %s %s\n" % (str(os.getpid()), str(n), "logger.debug"))

    # sqrt_n = int(math.floor(math.sqrt(n))) * 1
    print("# %s %s %s\n" % (str(os.getpid()), str(n), "exec " + str(n)))
    # time.sleep(n)
    for i in range(0, n, 1):
        None
        logger.debug(str(os.getpid()) + " " + str(n) + " Hello World! " + str(i))

    print("# %s %s %s\n" % (str(os.getpid()), str(n), "end"))
    logger.debug(str(os.getpid()) + " " + str(n) + " End Hello World!")
    return [[True, os.getpid()]]

def main():
    logger = mkLogger("Main", 999)
    logger.debug(str(os.getpid()) + " " + "Main" + " Hello World!")
    for n in PRIMES:
        # print("#n=", n, nlf[str(n)])
        lf = "Ex13ProcessPoolExecutorA." + str(n) + ".log"
    with concurrent.futures.ProcessPoolExecutor(max_workers=15) as executor:
        for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
            print('%d is prime: %s' % (number, prime))
            logger.debug('%d is prime: %s' % (number, prime))

if __name__ == '__main__':
    main()