제공되는 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()
댓글 없음:
댓글 쓰기