多线程

添加add threading

import threading

def main():

    added_thread=threading.Thread(target=thread_job)  #添加线程

    added_thread.start()  #运行添加的线程

    print(threading.active_count())     #输出有多少个激活了的线程

    print(threading.enumerate())     #输出激活了的线程的名称

    print(threading.current_thread())     #正在运行的线程

def thread_job():
    print('This is an added Thread,number is %s'% threading.current_thread())

join功能


1. 阻塞主进程,专注于执行多线程中的程序。

2. 多线程多join的情况下,依次执行各线程的join方法,前头一个结束了才能执行后面一个。

3. 无参数,则等待到该线程结束,才开始执行下一个线程的join。

4. 参数timeout为线程的阻塞时间,如 timeout=2 就是罩着这个线程2s 以后,就不管他了,继续执行下面的代码。

def thread_job():

    print('T1 start\n')

    for i in range(10):

        time.sleep(0.1)

    print('T1 finish\n')

def T2_job():

    print('T2 start\n')

    print('T2 finish\n')

def main():

    added_thread=threading.Thread(target=thread_job,name="T1")  #添加线程,命名为T1

    thread2=threading.Thread(target=T2_job,name="T")

    added_thread.start()

    thread2.start()

    added_thread.join()  #要等待added_thread运行完了后才运行join之后的命令

    thread2.join()

    print('all done\n')    

Queue功能

多线程无返回值,所以运算结果要放在一个长队列当中,对每一个线程的队列到主线程后再拿出来继续加算。

import threading

import time

from queue import Queue

def job():

    for i in range(len(l)):

        l[i]=l[i]**2

    q.put(l)

def multithreading(data):

    q=Queue()  #定义Q,之后在Q中放入计算的返回值,来替代return的功能

    threads=[]

    data=[[1,2,3],[3,4,5],[4,4,4],[5,5,5]]

    for i in range(4):

        t=threading.Thread(target=job,args=(data[i],q))

        t.start()

        threads.append(t)

    for thread in threads:

        thread.join()

    results=[]

    for_ in range(4):

        results.append(q.get()) #按顺序拿出一个

    print(results)

不一定有效率

多线程有一个全局的控制,其实并不是把任务平均分给每个人同时在做这个任务。他是GIL让程序把线程锁住,只有唯一一个线程在运算,然后不停地切换。其实只是节约了读写的时间,当读写的时候可以开始第二个线程。


        当两个线程没有太大关系时可能有效果。如果是处理同一个data,然后用多线程分步来做,就没什么用了。

Lock锁

def job1():

    global A,lock

    lock.acquire()

    for i in range(10):

        A+=1

        print('job1',A)

    lock.release()

def job2():

    global A,lock

    lock.acquire()

    for i in range(10):

        A+=10

        print('job2',A)

    lock.release()

if_name_:'_main_':

    lock=threading.Lock()

    A=0

    t1=threading.Thread(targe=job1)

    t2=threading.Thread(targe=job2)

    t1=start()

    t2=start()

    t1.join()

    t2.join()

你可能感兴趣的:(多线程)