python——多线程

多线程-threading
import  time
from threading import Thread
#如果多个线程执行的是同一个函数的话,各自之间不会有影响
def test():
    print("哈哈哈哈哈哈哈")
    time.sleep(1)

for i in range(5):
    t = Thread(target = test)
    t.start()
哈哈哈哈哈哈哈
哈哈哈哈哈哈哈
哈哈哈哈哈哈哈
哈哈哈哈哈哈哈
哈哈哈哈哈哈哈

子类完成创建多线程

import  time
import threading
class MyThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(3)
            msg = "I am "+self.name +'@'+str(i)
            print(msg)
        
if __name__ == '__main__':
    t = MyThread()
    t.start()
I am Thread-1@0
I am Thread-1@1
I am Thread-1@2
image.png

线程的执行顺序也是主线程和各个子线程随机执行,顺序不确定

线程对全局变量的修改

线程之间是共享全局变量的,进程间不共享变量,可以加一个flag来避免全局变量被修改。

使用互斥锁避免全局变量被修改

两个线程同时抢着上锁,如果有1方成功的上锁,那么导致另外一方会堵塞,一直等待这个锁被解开为止。所以叫互斥锁。
一般加锁会导致运行效率变低,所以,只在必要的地方加锁。以提高效率

#创建锁
mutex = threading.Lock()
#上锁
mutex.acquire()
#释放锁
mutex.release()

线程之间不共享全局变量

from threading import Thread
import  time
import threading

def test1():
    name = threading.current_thread().name
    print("thread name is %s"%name)
    g_num = 100
    if name == "Thread-1":
        g_num += 1
    else:
        time.sleep(2)
    print("thread name is %s----g_num=%d"%(name,g_num))

p1 = Thread(target=test1)
p1.start()
p2 = Thread(target=test1)
p2.start()
____________________________________________________
thread name is Thread-1
thread name is Thread-1----g_num=101
thread name is Thread-2
thread name is Thread-2----g_num=100
死锁

要尽量避免死锁
设置超时

生产者与消费者模式

队列就是给生产者和消费者解耦用

import threading
import time
from queue import Queue

class Producer(threading.Thread):
    def run(self):
        global queue
        count = 0
        while True:
            if queue.qsize() < 1000:
                for i in range(100):
                    count = count +1
                    msg = '生成产品'+str(count)
                    queue.put(msg)
                    print(msg)
            time.sleep(0.5)
 
class Consumer(threading.Thread):
    def run(self):
        global queue
        while True:
            if queue.qsize() > 100:
                for i in range(3):
                    msg = self.name + '消费了 '+queue.get()
                    print(msg)
            time.sleep(1)
 
 
if __name__ == '__main__':
    queue = Queue()
 
    for i in range(500):
        queue.put('初始产品'+str(i))
    for i in range(2):
        p = Producer()
        p.start()
    for i in range(5):
        c = Consumer()
        c.start()
异步
GIL问题(全局解释器锁)

python中多进程的效率远远大于多线程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一文读懂Python多线程 1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运...
    星丶雲阅读 1,636评论 0 4
  • 来源:数据分析网Threading 模块从 Python 1.5.2 版开始出现,用于增强底层的多线程模块 thr...
    PyChina阅读 1,825评论 0 5
  • 1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 假定工厂的电力有限,一...
    Andone1cc阅读 545评论 0 1
  • 1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 假定工厂的电力有限,一...
    文哥的学习日记阅读 14,519评论 0 9
  • 1.线程的基本概念 1.1 线程 线程是应用程序最小的执行单元,线程与进程类似,进程可以看做程序的一次执行,而线程...
    XYZeroing阅读 1,082评论 1 16

友情链接更多精彩内容