2018년 8월 13일 월요일

Python Thread / Multiprocessing예제



제공되는 Thread를 이용하기


import logging
import threading

logging.basicConfig(leve=logging.DEBUG, format="name: %(threadName)s, argument: %(message)s")

def worker(count):
    logging.debug(count)

def main():
    for i in range(5):
        t = threading.Thread(target=worker, name="thread %i" % i, args=(i,))
        t.start()

main()



CLASS를 만들어 이용하기


import logging
import threading


logging.basicConfig(level=logging.DEBUG, format="name: %(self.name)s, argument: %(message)s")

class Worker(threading.Thread):
    def __init__(self, args, name=""):
        threading.Thread.__init__(self)
        self.args = args

    def run(self):
        print("name: %s, arg: %i" % (self.name, self.args[0]))
        # logging.debug(self.args)

def main():
    for i in range(5):
        t = Worker(name="Thread %i" % i, args=(i,))
        t.start()

main()



Lock 예제


import time
import logging
import threading


logging.basicConfig(level=logging.DEBUG, format="name: %(threadName)s, argument: %(message)s")

def blocking_lock(lock):
    logging.debug("Start blocking lock")

    while True:
        time.sleep(1)
        lock.acquire()
        try:
            logging.debug("Grab it +++++++++++++++++++++++++++++++++++")
            time.sleep(1)
        finally:
            logging.debug("Release -----------------------------------")
            lock.release()

def nonblocking_lock(lock):
    logging.debug("Start nonblocking lock")

    attempt, grab = 0, 0
    while grab < 3:
        time.sleep(0.7)
        logging.debug("Attempt")
        success = lock.acquire(False)

        try:
            attempt += 1
            if success:
                logging.debug("Grab it")
                grab += 1
        finally:
            if success:
                time.sleep(0.22)
                logging.debug("Release")
                lock.release()

    logging.debug("Attempt : %s, grab : %i" % (attempt, grab))

def main():
    lock = threading.Lock()

    blocking = threading.Thread(target=blocking_lock, name="blocking", args=(lock,))
    blocking.setDaemon(True)
    blocking.start()

    nonblocking = threading.Thread(target=nonblocking_lock, name="nonblocking", args=(lock,))
    nonblocking.start()



main()


Multiprocessing 예제


import os
import multiprocessing

def worker(count):
    print("name: %s, arg: %i" % (multiprocessing.current_process().name, count))
    print("ppid: %i, pid: %i" % (os.getppid(), os.getpid()))

def main():
    for i in range(5):
        p = multiprocessing.Process(target=worker, name="process %i" %i, args=(i,))
        p.start()


if __name__ == "__main__":
    main()


Multiprocessing pool 예제


import time
import multiprocessing

def initmsg():
    print("Start proc %s" % multiprocessing.current_process().name)

def worker(data):
    print("Do calculate on proc %s with data %i" % (multiprocessing.current_process().name, data))
    return data*2

def main():
    p = multiprocessing.Pool(processes=4, initializer=initmsg)
   
    time.sleep(1)
    print("Do work !")

    data_list = range(10)
    result = p.map(worker, data_list)

    p.close()
    p.join()

    print("Result : %s" % result)


if __name__ == "__main__":
    main()

댓글 없음:

댓글 쓰기

200926.가오리코스 라이딩

9/26 골절인지 아닌지 확인 안됨. 이후 미세골절여부 확인 핸드폰을 드는 것도 어려움 9/29 x ray 다시 찍지 않고 이후 재 방문 요청 ...