Python-多任务-线程

创建线程

from threading import Thread
def test():
    pass
t = Thread(target=test)
t.start()

继承Thread来创建线程

from threading import Thread
class MyThread(Thread):
    def run(self):
        print(self.name)#self.name为默认线程name

t = MyThread()
t.start()

主线程会等待子线程结束后再结束

线程的执行顺序

不定

线程共享全局变量

互斥锁

threading.Lock

from threading import Lock

l = Lock()#创建一把互斥锁,默认没有上锁
l.acquire() #上锁,同一把锁只能上一次锁
l.release() #释放锁

预防死锁

设置超时时间

mylock.acquire(timeout=2)#设置超时时间为2,超过2秒后则不去阻塞等待解锁

多个线程使用非共享变量

线程里的局部变量不共享

from threading import Thread
import threading
import time

def test():
    num = 100
    if threading.cutrrent_thread()=="Thread-1":
        num +=1
    else:
        time.sleep(2)
    print(num)

t1 = Thread(target=test)
t2 = Thread(target=test)
t1.start() #打印101
t2.start() #打印100

扩展:队列Queue

使用队列来作为缓存

from queue import Queue #python3
#from Queue import Queue python 2

用法与multiprocessing.Queue一样,但不可作为进程间的通信

全局ThreadLocal

全局ThreadLocal只在所属线程里共享

import threading
import time

local = threading.local()

def test(name):
    global local
    local.name = name
    time.sleep(1)
    print(local.name)

t1 = threading.Thread(target=test,("123",))
t2 = threading.Thread(target=test,("456",))

t1.start()#123
t2.start()#456

GIL问题

Python的多线程是一个假的多线程,每次CPU只能执行一个线程,尽管是多核CPU也是这样.

例如:在双核CPU的电脑上运行双线程的程序,每次只能运行一个线程,那么就会使用两个CPU核来处理一条线程,Python解析器会不断切换线程来运行,故在外界眼里是两个线程是同时运行的

但是多进程却与多线程不同,若有多核CPU,运行多进程,每次都能同时运行多个进程

每个进程都会在其分配的CPU核里运行着,极大地利用了CPU的使用效率

故可以利用多进程来解决该问题

还可以利用C语言来解决该问题

这才是我们想要的嘛

在Python调用C动态库

首先写个函数(C是面向过程的嘛,把功能封装到函数里,再编译成库)

test.c

#include<stdio.h>
void hello() {
    printf("hello")
}

在Linux编译成动态库

gcc -fPIC -shared test.c -o libtest.so

-fPIC : 因为test.c里使用了stdio库,故需要该参数,该参数的用处:参考(知识涉及比较深,不用时报错了,使用了就没问题了)

http://www.cnblogs.com/cswuyg/p/3830703.html

http://blog.sina.com.cn/s/blog_54f82cc201011op1.html

-shared : 用于生成动态库
-o : 生成目标库(文件)的名字

此时在当前目录下生成libtest.so库文件

在Python程序里

import ctypes
test = ctypes.cdll.LoadLibrary("./libtest.so")#获取库对象
test.hello() #直接调用使用库里的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值