程松 2020-01-14
目录
import time import _thread def work(n): print('当前时间开始为:{}'.format(time.ctime())) time.sleep(n) print('当前时间结束为为:{}'.format(time.ctime())) def main(): print('当前时间为:{}'.format(time.ctime())) _thread.start_new_thread(work,(4,)) _thread.start_new_thread(work,(2,)) time.sleep(6) print('当前时间结束为:{}'.format(time.ctime())) if __name__ == '__main__': main()
threading.Thread
import time import threading def work(n): print('当前时间开始为:{}'.format(time.ctime())) time.sleep(n) print('当前时间结束为为:{}'.format(time.ctime())) def main(): print('main开始为:{}'.format(time.ctime())) threads = [] t1 = threading.Thread(target=work,args=(4,)) t2 = threading.Thread(target=work,args=(2,)) threads.append(t1) threads.append(t2) for t in threads: t.start() print('main结束为:{}'.format(time.ctime())) if __name__ == '__main__': main() ------------------------------------------------------------------------------ main开始为:Tue Jan 14 21:33:42 2020 当前时间开始为:Tue Jan 14 21:33:42 2020 当前时间开始为:Tue Jan 14 21:33:42 2020 main结束为:Tue Jan 14 21:33:42 2020 当前时间结束为为:Tue Jan 14 21:33:44 2020 当前时间结束为为:Tue Jan 14 21:33:46 2020
join()让主线程等待
import threading def work(n): print('当前时间开始为:{}'.format(time.ctime())) time.sleep(n) print('当前时间结束为为:{}'.format(time.ctime())) def main(): print('main开始为:{}'.format(time.ctime())) threads = [] t1 = threading.Thread(target=work,args=(4,)) t2 = threading.Thread(target=work,args=(2,)) threads.append(t1) threads.append(t2) for t in threads: t.start() for t in threads: t.join() print('main结束为:{}'.format(time.ctime())) if __name__ == '__main__': main() ----------------------------------------------------------------- main开始为:Tue Jan 14 21:36:57 2020 当前时间开始为:Tue Jan 14 21:36:57 2020 当前时间开始为:Tue Jan 14 21:36:57 2020 当前时间结束为为:Tue Jan 14 21:36:59 2020 当前时间结束为为:Tue Jan 14 21:37:01 2020 main结束为:Tue Jan 14 21:37:01 2020
自定义Mythread
import time import threading class MyThread(threading.Thread): def __init__(self,func,args): threading.Thread.__init__(self) self.func = func self.args = args def run(self): self.func(*self.args) def work(n): print('当前时间开始为:{}'.format(time.ctime())) time.sleep(n) print('当前时间结束为为:{}'.format(time.ctime())) def main(): print('main开始为:{}'.format(time.ctime())) threads = [] t1 = MyThread(work,(4,)) threads.append(t1) t2 = MyThread(work,(4,)) threads.append(t2) for t in threads: t.start() for t in threads: t.join() print('main结束为:{}'.format(time.ctime())) if __name__ == '__main__': main()
threading.Lock()
import threading import time import random eggs = [] lock1 = threading.Lock() def put_egg(n,list): lock1.acquire() for i in range(1,n+1): time.sleep(random.randint(0,2)) list.append(i) lock1.release() def main(): threads = [] t1 = threading.Thread(target=put_egg,args=(5,eggs)) threads.append(t1) t2 = threading.Thread(target=put_egg,args=(5,eggs)) threads.append(t2) for t in threads: t.start() for t in threads: t.join() print(eggs) if __name__ == '__main__': main() ------------------------------------------------------------- [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
with语法
def put_egg(n,list): with lock1: for i in range(1, n + 1): time.sleep(random.randint(0, 2)) list.append(i)
import threading import queue import time import random def producer(data_queue): for i in range(5): time.sleep(0.5) item = random.randint(0, 100) data_queue.put(item) print(f'{threading.current_thread().name}在队列中放入数据项{item}') def consumer(data_queue): while True: try: item = data_queue.get(timeout=3) print(f'{threading.current_thread().name}在队列中移除了数据项{item}') except queue.Empty: break else: data_queue.task_done() def main(): q = queue.Queue() threads = [] producer1 = threading.Thread(target=producer, args=(q,)) producer1.start() for i in range(2): c = threading.Thread(target=consumer, args=(q,)) threads.append(c) for t in threads: t.start() for t in threads: t.join() #队列所有项处理完毕前阻塞 q.join() if __name__ == '__main__': main()
IO密集型采用多线程,cpu密集型可采用多进程
import time import multiprocessing def fun(n): print(f'{multiprocessing.current_process().name} 执行开始于:{time.ctime()}') time.sleep(n) print(f'{multiprocessing.current_process().name} 执行结束于:{time.ctime()}') def main(): print(f'主函数运行于:{time.ctime()}') processes = [] p1 = multiprocessing.Process(target=fun,args=(4,)) processes.append(p1) p2 = multiprocessing.Process(target=fun,args=(4,)) processes.append(p2) for i in processes: i.start() for i in processes: i.join() print(f'主函数结束于:{time.ctime()}') if __name__ == '__main__': main()
import concurrent.futures def work(i): print(i) def fun1(): with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: executor.submit(work, 5) def fun2(): with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor: executor.submit(work, 5)