import threading
import time


CLOCKPERIOD = 0.10  # decrease for speed!
USE_GIL = False  # For more speed
ONE = 1


def threetimer():
    while True:
        yield 3.0


def fivetimer():
    while True: 
        yield 5.0


def fifteentimer():
    while True:
        yield 15.0


def numtimer():
    while True: 
        yield 1.0


def newlinetimer():
    while True:
        yield 1.0


def numprinter(starttime):
    i = ONE
    for delay in numtimer():
        time.sleep(delay * CLOCKPERIOD)
        if time.time() > starttime + 100.5 * CLOCKPERIOD:
            break
        print(str(i), end='')
        i = i + ONE


def threeprinter(starttime):
    for delay in threetimer():
        time.sleep(delay * CLOCKPERIOD)
        if time.time() > starttime + 100.5 * CLOCKPERIOD:
            break
        print('\rFIZZ', end='')
        

def newlineprinter(starttime):
    for delay in newlinetimer():
        time.sleep(delay * CLOCKPERIOD)
        if time.time() > starttime + 100.5 * CLOCKPERIOD:
            break
        print('')


def fiveprinter(starttime):
    for delay in fivetimer():
        time.sleep(delay * CLOCKPERIOD)
        if time.time() > starttime + 100.5 * CLOCKPERIOD:
            break
        print('\rBUZZ', end='')


def fifteenprinter(starttime):
    for delay in fifteentimer():
        if time.time() > starttime + 100.5 * CLOCKPERIOD:
            break
        time.sleep(delay * CLOCKPERIOD)
        print('\rFIZZBUZZ', end='')


if __name__ == '__main__':
    p = threading.Thread(target=numprinter, kwargs={'starttime': time.time()})
    p3 = threading.Thread(target=threeprinter, kwargs={'starttime': time.time()})
    p2 = threading.Thread(target=newlineprinter, kwargs={'starttime': time.time()})
    p4 = threading.Thread(target=fiveprinter, kwargs={'starttime': time.time()})
    p5 = threading.Thread(target=fifteenprinter, kwargs={'starttime': time.time()})
    p.start()
    time.sleep(CLOCKPERIOD * 0.10)
    p3.start()
    time.sleep(CLOCKPERIOD * 0.10)
    p4.start()
    time.sleep(CLOCKPERIOD * 0.10)
    p5.start()
    time.sleep(CLOCKPERIOD * 0.10)
    p2.start()
    p.join()
    p2.join()
    p3.join()
    p4.join()
    p5.join()
    print('')