美文网首页
Python线程

Python线程

作者: Dalvik_ | 来源:发表于2019-01-17 11:00 被阅读0次

线程的创建

1.通过创建Thread类指定target来实现

from threading import Thread
import time

def test():
    print("----------1-------")
    time.sleep(1)

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

2.通过继承Thread类重写run方法来实现

from threading import Thread
import time

def test():
    print("----------1-------")
    time.sleep(1)

class MyThread(Thread):
    def run(self):
        test()
for i in range(5):
    t = MyThread()
    t.start()

3.同一个进程中的线程之间共享全局变量

线程与进程的区别

定义的不同

  • 进程是系统进行资源分配和调度的一个独立单位.
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

互斥锁

#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([blocking])
#释放
mutex.release()

死锁

避免死锁的方式
1.上锁添加超时时间

mutex = Lock()
mutex.acquire(timeout=3)

2.银行家算法

生产者与消费者模式

#encoding=utf-8
import threading
import time

#python2中
from Queue import Queue

#python3中
# 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()

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

ThreadLocal

import threading

# 创建全局ThreadLocal对象:
local_school = threading.local()


def process_student():
    # 获取当前线程关联的student:
    std = local_school.student
    print('Hello, %s (in %s)' % (std, threading.current_thread().name))


def process_thread(name):
    # 绑定ThreadLocal的student:
    local_school.student = name
    process_student()


t1 = threading.Thread(target=process_thread, args=('dongGe',), name='Thread-A')
t2 = threading.Thread(target=process_thread, args=('老王',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()

异步

from multiprocessing import Pool
import time
import os


def test():
    print("---进程池中的进程---pid=%d,ppid=%d--" % (os.getpid(), os.getppid()))
    for i in range(3):
        print("----%d---" % i)
        time.sleep(1)
    return "hahah"


def test2(args):
    print("---callback func--pid=%d" % os.getpid())
    print("---callback func--args=%s" % args)


pool = Pool(3)
pool.apply_async(func=test, callback=test2)

time.sleep(5)

print("----主进程-pid=%d----" % os.getpid())

GIL 全局解释器锁

python解释器在解释python程序时,多线程的任务会存在GIL问题,也就是多线程执行时实际是只有单线程会占用CPU,多核CPU并不会同时执行多线程的程序。
避免GIL问题的方式:
1.采用多进程来实现多任务
2.采用C语言来实现多线程任务

把一个c语言文件编译成一个动态库的命令(linux平台下):
gcc xxx.c -shared -o libxxxx.so
from ctypes import *
from threading import Thread

#加载动态库
lib = cdll.LoadLibrary("./libdeadloop.so")

#创建一个子线程,让其执行c语言编写的函数,此函数是一个死循环
t = Thread(target=lib.DeadLoop)
t.start()

#主线程,也调用c语言编写的那个死循环函数
#lib.DeadLoop()

while True:
    pass

相关文章

  • 11-9 多线程和多进程

    Python的GIL是针对进程还是线程?  是线程 Python多核cpu可以运行多线程吗? Python线程执行...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • 多线程

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python 多线程 threading和multiproces

    Python 多线程 threading和multiprocessing模块 Python中常使用的线程模块 th...

  • Mr.Li--python-系统编程-线程

    线程 多线程--threading python的thread模块是比较底层的模块,python的threadin...

  • Python多线程编程——创建线程的两个方法

    之前的一篇文章:Python多线程编程——多线程基础介绍,主要介绍了线程的基本知识,以及使用Python创建线程的...

  • python系统编程2

    线程 1.1.1 多线程——threading python的thread模块是比较底层的模块,python的th...

  • python的线程模块和基本用法笔记

    python的线程模块和基本用法笔记 python线程中的模块:thread,threading,queue等程序...

  • GIL

    谈谈python的GIL、多线程、多进程 最近在看 Python 的多线程,经常我们会听到老手说:“python下...

  • Python-线程、线程池

    1. Python多线程 python3中常用的线程模块为:_thread(Python2中的thread)、th...

网友评论

      本文标题:Python线程

      本文链接:https://www.haomeiwen.com/subject/gwxydqtx.html