多线程学习典例python

#coding:utf-8

import threading

import random

import Queue

from time import sleep

import sys

#

#需求分析:有大批量数据需要执行,而且是重复一个函数操作(例如爆破密码),如果全部开始线程数N多,这里控制住线程数m个并行执行,其他等待

#

#继承一个Thread类,在run方法中进行需要重复的单个函数操作

class Test(threading.Thread):

  def __init__(self,queue,lock,num):

    #传递一个队列queue和线程锁,并行数

    threading.Thread.__init__(self)

    self.queue=queue

    self.lock=lock

    self.num=num

  def run(self):

    #while True:#不使用threading.Semaphore,直接开始所有线程,程序执行完毕线程都还不死,最后的print threading.enumerate()可以看出

    with self.num:#同时并行指定的线程数量,执行完毕一个则死掉一个线程

      #以下为需要重复的单次函数操作

      n=self.queue.get()#等待队列进入

      lock.acquire()#锁住线程,防止同时输出造成混乱

      print '开始一个线程:',self.name,'模拟的执行时间:',n

      print '队列剩余:',queue.qsize()

      print threading.enumerate()

      lock.release()

      sleep(n)#执行单次操作,这里sleep模拟执行过程

      self.queue.task_done()#发出此队列完成信号

threads=[]

queue=Queue.Queue()

lock=threading.Lock()

num=threading.Semaphore(3)#设置同时执行的线程数为3,其他等待执行

#启动所有线程

for i in range(10):#总共需要执行的次数

  t=Test(queue,lock,num)

  t.start()

  threads.append(t)

  #吧队列传入线程,是run结束等待开始执行,放下面单独一个for也行,这里少个循环吧

  n=random.randint(1,10)

  queue.put(n)#模拟执行函数的逐个不同输入

#吧队列传入线程,是run结束等待开始执行

#for t in threads:

#  n=random.randint(1,10)

#  queue.put(n)

#等待线程执行完毕

for t in threads:

  t.join()

queue.join()#等待队列执行完毕才继续执行,否则下面语句会在线程未接受就开始执行

print '所有执行完毕'

print threading.active_count()

print threading.enumerate()

 

 

 

 

转自:https://www.jb51.net/article/95719.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值