Pythonのマルチプロセス及びマルチスレッド制御同時要約の数

I.はじめには、
元々のコードをクラックする暴力のためのスクリプトを書きましたが、1は222万件のスレッドがそれを行うオープン、二私の一日のパスワード222万パスワードをしようとしますが、唯一のフルのために複数のスレッドを使用したいですか?スレッドの数を制御するために学ばなければならなかった、公式の文書は構造が明確でないこと、良い見ていない、多くの記事を見つけるためにインターネットが唯一のフルスレッドのため、また、非常に明確ではないが、最終的には最終的な記事や公式文書によると、制御のスレッド数を指定していません徹底的に長い時間のために恐れて、マルチスレッドベースの方法を達成する方法を理解し、忘れてはいけないと考え、彼はトラブルの投稿です、そして私のような初心者にもリファレンスを参照してくださいすることができますを発見しました。
:私はプロセスとスレッドの違いについてお話しましょう
彼らは、プロセスのアドレス空間を共有し、プロセスは、少なくとも1件のスレッドがあり、プロセス内の実行ユニットとプロセスは、独自の独立したアドレス空間を持つ;:アドレス空間
資源の所有者:資源配分のプロセスとしてい単位、リソースの処理プロセスシェア内のスレッドと
スレッドがプロセッサスケジューリングの基本単位であるが、プロセスではない。
双方は、同時に実行できる
プログラムと同様の処理が、並行単純な類似の言葉を理解できないとしません干渉。1つまたは複数のスレッドによる処理のスレッドが処理を実行し、同時実行CPUは常にもちろん、あなたが近づいて感じることができない、実行するために前後に切り替えています。

それを実行している間、私たちは二つの平行なアプローチを使用することができ、多くの時間の無駄を実行するために、いくつかの待ち時間があるかもしれない私は、例えば遭遇した上での困難を取り、大量のデータが同じプロセスを実行する必要があり、操作の途中:

平行に並列プロセスまたはスレッド

長所と短所、状況に応じて、絶対的ではなく、これを議論していない、これは、次の2つのPythonの並列処理上げる(注釈の感触は非常に詳細にクリアし、これ以上言いません)

774711191、高齢者が学んでいる方法を見て:私たちは、Pythonのバックルqunを学ぶお勧めします!基本的なWeb開発Pythonスクリプトからなど、爬虫類、ジャンゴ、データマイニング、へ[PDF、実際のソースコード]、ゼロベースのプロジェクトの戦闘データに仕上げています。どんな小さなPythonのパートナーに与えられました!毎日ダニエルは、タイミングPythonの技術を説明し、細部に注意を払うに学び、必要する方法のいくつかを共有するために、私たちに参加をクリックして収集し、学習者のPython
第二に、プロセスアプローチを

#coding:utf-8
import random
from time import sleep
import sys
import multiprocessing
import os
#
#需求分析:有大批量数据需要执行,而且是重复一个函数操作(例如爆破密码),如果全部开始线程数N多,这里控制住线程数m个并行执行,其他等待
#
lock=multiprocessing.Lock()#一个锁
def a(x):#模拟需要重复执行的函数
  lock.acquire()#输出时候上锁,否则进程同时输出时候会混乱,不可读
  print '开始进程:',os.getpid(),'模拟进程时间:',x
  lock.release()
   
  sleep(x)#模拟执行操作
   
  lock.acquire()
  print '结束进程:',os.getpid(),'预测下一个进程启动会使用该进程号'
  lock.release()
list=[]
for i in range(10):#产生一个随机数数组,模拟每次调用函数需要的输入,这里模拟总共有10组需要处理
  list.append(random.randint(1,10))
   
pool=multiprocessing.Pool(processes=3)#限制并行进程数为3
pool.map(a,list)#创建进程池,调用函数a,传入参数为list,此参数必须是一个可迭代对象,因为map是在迭代创建每个进程

出力:三、スレッド方法:ここに画像を挿入説明
第三に、スレッディング方法:

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

出力:ここに画像を挿入説明

公開された15元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/haoxun02/article/details/104216320