Python多线程

来源:互联网 发布:女生学php好找工作吗 编辑:程序博客网 时间:2024/06/10 20:49
#!/usr/bin/env python3import time, threading, queue#----------------多线程----------------# 简单多线程exdef method1():    count = 5    while count > 0:        print(time.ctime(time.time()))        print(threading.current_thread().name)        count-=1t = threading.Thread(target = method1 , name = 'method1Thread')t.start()t.join()print(threading.current_thread().name)# lockbalance = 0lock = threading.Lock()def change_it(n):    # 先存后取,结果应该为0:    global balance    balance = balance + n    balance = balance - ndef run_thread(n):    # 直接如下执行结果可能不为0    # for i in range(100000):        # change_it(n)    # 结果为0    for i in range(100000):        # 先要获取锁:        lock.acquire()        try:            change_it(n)        finally:            # 改完了一定要释放锁:            lock.release()t1 = threading.Thread(target=run_thread, args=(5,))t2 = threading.Thread(target=run_thread, args=(8,))t1.start()t2.start()t1.join()t2.join()print(balance)print(threading.enumerate())'''    1.为什么Python死循环不会占用百分之百cpu N核cpu跑满需要n个死循环:    因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。    2.线程模块    threading.currentThread(): 返回当前的线程变量。    threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。    threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。    除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:    run(): 用以表示线程活动的方法。    start():启动线程活动。    join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。    isAlive(): 返回线程是否活动的。    getName(): 返回线程名。    setName(): 设置线程名。'''# 线程优先级队列 Queue'''    Queue.qsize() 返回队列的大小    Queue.empty() 如果队列为空,返回True,反之False    Queue.full() 如果队列满了,返回True,反之False    Queue.full 与 maxsize 大小对应    Queue.get([block[, timeout]])获取队列,timeout等待时间    Queue.get_nowait() 相当Queue.get(False)    Queue.put(item) 写入队列,timeout等待时间    Queue.put_nowait(item) 相当Queue.put(item, False)    Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号    Queue.join() 实际上意味着等到队列为空,再执行别的操作'''queue = queue.Queue(10)queue.put(t1)queue.put(t2)print(queue.empty())print(queue.qsize())
0 0
原创粉丝点击