Python 多线程 threading

#!/usr/bin/python
# -*- coding: utf-8 -*-

__author__ = ‘gaogd‘

‘‘‘

### 多进程
import threading
import time

def run(num):
    print ‘Hi, I am thread %s..lalala‘ % num
    time.sleep(1)

for i in range(20):
  t = threading.Thread(target=run, args=(i,))
  t.start()

‘‘‘

‘‘‘

##进程启动完20个线程就继续走下去,不等待这20个线程走完就回到住线程
import threading
import time

def run(num):
    global NUM
    time.sleep(1)
    print ‘Hi, I am thread %s..lalala‘ % num
    NUM +=1

NUM = 0
for i in range(20):
  t = threading.Thread(target=run, args=(i,))
  t.start()      ##

#time.sleep(2)
print  ‘------>‘,NUM

‘‘‘

‘‘‘

import threading
import time

def run(num):
    global NUM
    time.sleep(1)
    print ‘Hi, I am thread %s..lalala‘ % num
    NUM +=1

NUM = 0
for i in range(20):
    t = threading.Thread(target=run, args=(i,))
    t.start()
    t.join()      ##等子线程执行完再执行子线程。
print  ‘------>‘,NUM

‘‘‘

‘‘‘
###下面两百个线程时并发执行,但是共享内存有点问题
import threading
import time

def run(num):
    global NUM
    time.sleep(1)
    print ‘Hi, I am thread %s..lalala‘ % num
    NUM +=1

NUM = 0
p_list = []    ##线程列表,追加线程实例 t 到这个列表
for i in range(500):
    t = threading.Thread(target=run, args=(i,))
    t.start()
    p_list.append(t)

for i in p_list:
    t.join()      ##等待线程都执行完再执行这个,但是共享的内存有可能出现问题,所有出现NUM不一定等于500,没有加锁导致的问题,这就涉及安全了
print  ‘------>‘,NUM

‘‘‘

import threading
import time

def run(num):
    global NUM
    time.sleep(1)
    print ‘Hi, I am thread %s..lalala‘ % num
    lock.acquire()  ## 加锁
    NUM +=1
    lock.release()   ##释放锁,如果不释放,那后面的就都改不了数据了

NUM = 0
p_list = []
lock = threading.Lock()     ##生成一把锁
for i in range(500):
    t = threading.Thread(target=run, args=(i,))
    t.start()
    p_list.append(t)

for i in p_list:
    t.join()      ##等待线程都执行完再执行这个,但是共享的内存有可能出现问题,所有出现NUM不一定等于200,没有加锁导致的问题,这就涉及安全了
print  ‘------>‘,NUM

Event

#_*_coding:utf-8_*_
__author__ = ‘jieli‘

import threading,time
import random
def light():
    if not event.isSet():
        event.set() #wait就不阻塞 #绿灯状态
    count = 0
    while True:
        if count < 10:
            print ‘\033[42;1m--green light on---\033[0m‘
        elif count <13:
            print ‘\033[43;1m--yellow light on---\033[0m‘
        elif count <20:
            if event.isSet():
                event.clear() #clear the green light , switch on the red light
            print ‘\033[41;1m--red light on---\033[0m‘
        else:
            count = 0
            event.set() #打开绿灯
        time.sleep(1)
        count +=1
def car(n):
    while 1:
        time.sleep(random.randrange(3))
        if  event.isSet(): #绿灯
            print "car [%s] is running.." % n
        else:# red light
            print "car [%s] is waiting for the red light.." %n
            event.wait()
            print "Green light is on , car %s is running.............." %n

if __name__ == ‘__main__‘:
    event = threading.Event()
    Light = threading.Thread(target=light)
    Light.start()
    for i in range(3):
        t = threading.Thread(target=car,args=(i,))
        t.start()

‘‘‘
Events #

An event is a simple synchronization object;
the event represents an internal flag, and threads
can wait for the flag to be set, or set or clear the flag themselves.

event = threading.Event()

# a client thread can wait for the flag to be set
event.wait()

# a server thread can set or reset it
event.set()
event.clear()
If the flag is set, the wait method doesn’t do anything.
If the flag is cleared, wait will block until it becomes set again.
Any number of threads may wait for the same event.
‘‘‘

lock


#_*_coding:utf-8_*_
__author__ = ‘jieli‘
import threading,time
def run(n):
    time.sleep(0.5)
    global  num
    lock.acquire() #申请锁并+锁
    num +=1
    lock.release() #释放锁
if __name__ == ‘__main__‘:
    num = 0
    lock = threading.Lock()
    for i in range(1000):
        t = threading.Thread(target=run,args=(i,))
        t.start()

while threading.active_count() != 1:
    print threading.active_count()
else:
    print ‘----all threads done---‘
    print num

Rlock

#_*_coding:utf-8_*_
__author__ = ‘jieli‘
import threading,time

def run1():
    print "grab the first part data"
    lock.acquire()
    global num
    num +=1
    lock.release()
    return num
def run2():
    print "grab the second part data"
    lock.acquire()
    global  num2
    num2+=1
    lock.release()
    return num2
def run3():
    lock.acquire()
    res = run1()
    print ‘--------between run1 and run2-----‘
    res2 = run2()
    lock.release()
    print res,res2

if __name__ == ‘__main__‘:

    num,num2 = 0,0
    lock = threading.RLock()
    for i in range(10):
        t = threading.Thread(target=run3)
        t.start()

while threading.active_count() != 1:
    print threading.active_count()
else:
    print ‘----all threads done---‘
    print num
semaphore
#_*_coding:utf-8_*_
__author__ = ‘jieli‘
import threading,time

def run(n):
    semaphore.acquire()
    time.sleep(1)
    print "run the thread: %s\n" %n
    semaphore.release()

if __name__ == ‘__main__‘:
    num= 0
    semaphore  = threading.BoundedSemaphore(5)
    for i in range(20):
        t = threading.Thread(target=run,args=(i,))
        t.start()
while threading.active_count() != 1:
    pass #print threading.active_count()
else:
    print ‘----all threads done---‘
    print num
时间: 2024-08-09 06:33:51

Python 多线程 threading的相关文章

Python 多线程threading模块

首先,我们在了解多线程时需要理解的就是什么是多线程,按照官方的解释就是:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术. 在我自学到这里的时候,通过会在想进程和线程到底是有什么区别,我的理解就是: 进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,一个进程可以包含多个线程. 下面就以简单的例子来加强我们对python 线程的理解. 默认情况下,我们在没有启动线程的时候,可以看一下程序总的运行时间,应该是每个函数

python多线程-threading模块

threading 是我们常用的用于 python 多线程的模块,其功能更加丰富.下面我们就来开始学习这个模块. 同样的,我这里声明一样我使用的版本是 python2.7,不同版本直接可能存在差异. 老规矩,使用 help() 函数获取帮助文档,看看里面有什么内容. threading 模块中提供了一个 thread 的类,注意不要和 thread 模块搞混了,两者差别还是很大的.thread 这个类可以实例化一个对象,每个对象代表一个线程,可以调用其中的 run() 方法来开启一个线程的运行.

再看python多线程------threading模块

现在把关于多线程的能想到的需要注意的点记录一下: 关于threading模块: 1.关于 传参问题 如果调用的子线程函数需要传参,要在参数后面加一个","否则会抛参数异常的错误. 如下: 1 for i in xrange(5): 2 threads.append(threading.Thread(target=worker,args=(i,))) 2.关于join()阻塞 join()方法一旦被调用,这个线程就会被阻塞住,等其他线程执行完才执行自身.当我们在主线程A中,创建了n个子线

Python多线程threading用法

Python里面经常会用到多线程,即所有的方法在同一时间开始运行,而不是按顺序一个一 个运行.所用到的模块为threading,下面详解threading用法. 我们写三个方法,one.two.three并正常运行. 这里只截图了one()方法,two.three与one内容一样. 按下面图中的运行方式,三个函数是分别在不同时间运行的. 我们用threading使三个方法在同一时间运行   定义一个线程池并把要运行的线程都写到这个线程池列表里: threads= [] #定义一个线程池t1 =

[Python 多线程] threading.local类 (六)

在使用threading.local()之前,先了解一下局部变量和全局变量. 局部变量: import threading import time def worker(): x = 0 for i in range(100): time.sleep(0.0001) x += 1 print(threading.current_thread(),x) for i in range(10): threading.Thread(target=worker).start() 运行结果: <Thread

Python多线程threading

介绍 在Python中,使用多线程multi-threading可以『同时』执行多个任务,比如你需要一个线程来复制读取信息,另一个线程来解析.为什么这里的同时要加引号呢,这是由于Python中GIL,也就是全局锁,看似同时执行多个任务,实际上是分布执行的,只不过各自完成不同的任务会提高工作效率.如果你不了解GIL,请看下图 实例教程 实例1 import threading def job(): info = "this is an added thread, which is %s"

python 多线程threading

上一篇说到thread模块,我们要自己解决线程锁.其实也没有什么啦.只是现在的人都比较懒,既然有高级封装的函数为什么要自己写. 所以就有了threading. 其实都一样啦. 来一个最简单的threading代码: 1 import threading #导入thrteading模块 2 3 def run(): #线程函数,打印线程名字和i的值 4 for i in range(100): 5 print(threading.current_thread().getName()+"------

python 多线程threading的使用

一.线程创建方法 1. 普通创建 import threading def run(name): for i in range(3): print(name) if __name__ == '__main__': t1 = threading.Thread(target=run, args=("t1",)) t2 = threading.Thread(target=run, args=("t2",)) t1.start() t2.start() ----------

Python多线程(threading)学习总结

注:此文除了例子和使用心得是自己写的,很多都是Python核心编程中的原文.原文文风应该能看出来,就不每个地方单独表明出处了. 线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境.它们可以想像成是在主进程或"主线程"中并行运行的"迷你进程". 线程有开始,顺序执行和结束三部分.它有一个自己的指令指针,记录自己运行到什么地方.线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步.一个