python多进程类方法(如何使用python的multiprocess多进程)

1.如何使用python的multiprocess多进程

#!/usr/bin/env python

# encoding: utf-8

from multiprocessing.dummy import Pool as ThreadPool

import socket

import time

def scan(port):

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.settimeout(0.1)

ip='220.181.136.241'

#print port

try:

s.connect((ip,port))

#print port

except:

pass

else:

print 'port is %s',port

s.close()

port=range(10000)

pool=ThreadPool(60)

start=time.time()

results=pool.map(scan,port)

#print results

pool.close()

pool.join()

print time.time()-start

python多线程多进程,pythonqueue多进程,python多进程共享数据

2.如何使用python的multiprocess多进程

#!/usr/bin/env python# encoding: utf-8from multiprocessing.dummy import Pool as ThreadPoolimport socketimport timedef scan(port): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.settimeout(0.1) ip='220.181.136.241' #print port try: s.connect((ip,port)) #print port except: pass else: print 'port is %s',port s.close()port=range(10000)pool=ThreadPool(60)start=time.time()results=pool.map(scan,port)#print resultspool.close()pool.join()print time.time()-start。

进程,方法,python

3.python多进程,多线程分别是并行还是并发

并发和并行 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。 并行的关键是你有同时处理多个任务的能力。

所以我认为它们最关键的点就是:是否是『同时』。Python 中没有真正的并行,只有并发 无论你的机器有多少个CPU, 同一时间只有一个Python解析器执行。

这也和大部分解释型语言一致, 都不支持并行。这应该是python设计的先天缺陷。

javascript也是相同的道理, javascript早起的版本只支持单任务,后来通过worker来支持并发。Python中的多线程 先复习一下进程和线程的概念 所谓进程,简单的说就是一段程序的动态执行过程,是系统进行资源分配和调度的一个基本单位。

一个进程中又可以包含若干个独立的执行流,我们将这些执行流称为线程,线程是CPU调度和分配的基本单位。同一个进程的线程都有自己的专有寄存器,但内存等资源是共享的。

这里有一个更加形象的解释, 出自阮一峰大神的杰作: Python中的thread的使用 通过 thread.start_new_thread 方法 import thread import time# Define a function for the thread def print_time( threadName, delay):count = 0 while count < 5:time.sleep(delay) count += 1 print "%s: %s" % ( threadName, time.ctime(time.time()) )# Create two threads as follows try:thread.start_new_thread( print_time, ("Thread-1", 2, ) ) thread.start_new_thread( print_time, ("Thread-2", 4, ) ) except:print "Error: unable to start thread" while 1:pass 通过继承thread#!/usr/bin/python import threading import time exitFlag = 0 class myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self):print "Starting " + self.name print_time(self.name, self.counter, 5) print "Exiting " + self.name def print_time(threadName, delay, counter):while counter:if exitFlag:threadName.exit() time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1# Create new threads thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2)# Start new Threads thread1.start() thread2.start() print "Exiting Main Thread" 线程的同步#!/usr/bin/python import threading import time class myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self):print "Starting " + self.name# Get lock to synchronize threads threadLock.acquire() print_time(self.name, self.counter, 3)# Free lock to release next thread threadLock.release() def print_time(threadName, delay, counter):while counter:time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1 threadLock = threading.Lock() threads = []# Create new threads thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2)# Start new Threads thread1.start() thread2.start()# Add threads to thread list threads.append(thread1) threads.append(thread2)# Wait for all threads to complete for t in threads:t.join() print "Exiting Main Thread" 利用multiprocessing多进程实现并行 进程的创建 Python 中有一套类似多线程API 的的类来进行多进程开发: multiprocessing 这里是一个来自官方文档的例子:from multiprocessing import Process def f(name):print 'hello', name if __name__ == '__main__':p = Process(target=f, args=('bob',)) p.start() p.join() 类似与线程,一可以通过继承process类来实现:from multiprocessing import Process class Worker(Process):def run(self):print("in" + self.name) if __name__ == '__main__':jobs = [] for i in range(5):p = Worker() jobs.append(p) p.start() for j in jobs:j.join() 进程的通信 Pipe() pipe()函数返回一对由双向通信的管道连接的对象,这两个对象通过send, recv 方法实现 信息的传递 from multiprocessing import Process, Pipe def f(conn):conn.send([42, None, 'hello']) conn.close() if __name__ == '__main__':parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print parent_conn.recv() # prints "[42, None, 'hello']" p.join() Quene from multiprocessing import Process, Queue def f(q):q.put([42, None, 'hello']) if __name__ == '__main__':q = Queue() p = Process(target=f, args=(q,)) p.start() print q.get() # prints "[42, None, 'hello']" p.join() 进程间的同步 Python 中多进程中也有类似线程锁的概念,使用方式几乎一样:from multiprocessing import Process, Lock 。

4.python中多进程+协程的使用以及为什么要用它

python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重、切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL,所以一个进程只能跑满一个CPU),因为一个进程占用一个CPU时能充分利用机器的性能,但是进程多了就会出现频繁的进程切换,反而得不偿失。

不过特殊情况(特指IO密集型任务)下,多线程是比多进程好用的。

举个例子:给你200W条url,需要你把每个url对应的页面抓取保存起来,这种时候,单单使用多进程,效果肯定是很差的。为什么呢?

例如每次请求的等待时间是2秒,那么如下(忽略cpu计算时间):

1、单进程+单线程:需要2秒*200W=400W秒==1111.11个小时==46.3天,这个速度明显是不能接受的

2、单进程+多线程:例如我们在这个进程中开了10个多线程,比1中能够提升10倍速度,也就是大约4.63天能够完成200W条抓取,请注意,这里的实际执行是:线程1遇见了阻塞,CPU切换到线程2去执行,遇见阻塞又切换到线程3等等,10个线程都阻塞后,这个进程就阻塞了,而直到某个线程阻塞完成后,这个进程才能继续执行,所以速度上提升大约能到10倍(这里忽略了线程切换带来的开销,实际上的提升应该是不能达到10倍的),但是需要考虑的是线程的切换也是有开销的,所以不能无限的启动多线程(开200W个线程肯定是不靠谱的)

3、多进程+多线程:这里就厉害了,一般来说也有很多人用这个方法,多进程下,每个进程都能占一个cpu,而多线程从一定程度上绕过了阻塞的等待,所以比单进程下的多线程又更好使了,例如我们开10个进程,每个进程里开20W个线程,执行的速度理论上是比单进程开200W个线程快10倍以上的(为什么是10倍以上而不是10倍,主要是cpu切换200W个线程的消耗肯定比切换20W个进程大得多,考虑到这部分开销,所以是10倍以上)。

还有更好的方法吗?答案是肯定的,它就是:

4、协程,使用它之前我们先讲讲what/why/how(它是什么/为什么用它/怎么使用它)

what:

协程是一种用户级的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:

协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。

在并发编程中,协程与线程类似,每个协程表示一个执行单元,有自己的本地数据,与其它协程共享全局数据和其它资源。

why:

目前主流语言基本上都选择了多线程作为并发设施,与线程相关的概念是抢占式多任务(Preemptive multitasking),而与协程相关的是协作式多任务。

不管是进程还是线程,每次阻塞、切换都需要陷入系统调用(system call),先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个进程(线程)。而且由于抢占式调度执行顺序无法确定的特点,使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题(事件驱动和异步程序也有同样的优点)。

因为协程是用户自己来编写调度逻辑的,对CPU来说,协程其实是单线程,所以CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程。

how:

python里面怎么使用协程?答案是使用gevent,使用方法:看这里

使用协程,可以不受线程开销的限制,我尝试过一次把20W条url放在单进程的协程里执行,完全没问题。

所以最推荐的方法,是多进程+协程(可以看作是每个进程里都是单线程,而这个单线程是协程化的)

多进程+协程下,避开了CPU切换的开销,又能把多个CPU充分利用起来,这种方式对于数据量较大的爬虫还有文件读写之类的效率提升是巨大的。

5.一个for循环的Python脚本程序中如何加入多进程(并发进程)呢,急

简单的如下

1

2

3

4

5

6

7

8

frommultiprocessing importProcess

defps(i):

print(str(i))

defrun():

fori inrange(5):

Process(target=ps, args=(i, )).start()

if__name__ =="__main__":

run()

6.python 多进程和多线程配合

由于python的多线程中存在PIL锁,因此python的多线程不能利用多核,那么,由于现在的计算机是多核的,就不能充分利用计算机的多核资源。

但是python中的多进程是可以跑在不同的cpu上的。因此,尝试了多进程+多线程的方式,来做一个任务。

比如:从中科大的镜像源中下载多个rpm包。#!/usr/bin/pythonimport reimport commandsimport timeimport multiprocessingimport threadingdef download_image(url):print '*****the %s rpm begin to download *******' % url commands.getoutput('wget %s' % url)def get_rpm_url_list(url):commands.getoutput('wget %s' % url) rpm_info_str = open('index.html').read() regu_mate = '(?<=)' rpm_list = re.findall(regu_mate, rpm_info_str) rpm_url_list = [url + rpm_name for rpm_name in rpm_list] print 'the count of rpm list is: ', len(rpm_url_list) return rpm_url_ def multi_thread(rpm_url_list):threads = [] # url = 'mands.getoutput('wget %s' %each_url) def main():url = '/centos/7/os/x86_64/Packages/' url_paas = '/centos/7.3.1611/paas/x86_64/openshift-origin/' url_paas2 ='/fedora/development/26/Server/x86_64/os/Packages/u/' start_time = time.time() rpm_list = get_rpm_url_list(url_paas) print multi_process(rpm_list) # print multi_thread(rpm_list)#print multi_process()# print multi_thread(rpm_list)# for index in range(len(rpm_list)):# print 'rpm_url is:', rpm_list[index] end_time = time.time() print 'the download time is:', end_time - start_timeprint main() 代码的功能主要是这样的: main()方法中调用get_rpm_url_list(base_url)方法,获取要下载的每个rpm包的具体的url地址。其中base_url即中科大基础的镜像源的地址,比如:/centos/7.3.1611/paas/x86_64/openshift-origin/,这个地址下有几十个rpm包,get_rpm_url_list方法将每个rpm包的url地址拼出来并返回。

multi_process(rpm_url_list)启动多进程方法,在该方法中,会调用多线程方法。该方法启动4个多进程,将上面方法得到的rpm包的url地址进行分组,分成4组,然后每一个组中的rpm包再最后由不同的线程去执行。

从而达到了多进程+多线程的配合使用。 代码还有需要改进的地方,比如多进程启动的进程个数和rpm包的url地址分组是硬编码,这个还需要改进,毕竟,不同的机器,适合同时启动的进程个数是不同的。

python多进程类方法

转载请注明出处编程代码网 » python多进程类方法(如何使用python的multiprocess多进程)

资讯

python多继承经典(Python为什么会引入多继承)

阅读(33)

本文主要为您介绍python多继承经典,内容包括Python为什么会引入多继承,Python的发展历程有知道的吗?介绍介绍呗,关于Python的定义你知道多少呢。按照面向对象的思想,多继承的存在是合理的。只是,多重继承很容易就会导致复杂度失控,所以有的语

资讯

python断言作用(自学python有什么用?找工作有人要不?)

阅读(37)

本文主要为您介绍python断言作用,内容包括python中的断言如何使用,自学python有什么用?找工作有人要不?,求、python语言的用途。首先要分析你自学他干啥,为了兴趣?那就不要问有啥用了。为了帮助你的工作?你看这就是一个作用为了找工作,好吧,你可

资讯

python打开文件夹内所有文件(Python常见文件如何操作?)

阅读(38)

本文主要为您介绍python打开文件夹内所有文件,内容包括python如何获取一个文件夹内包括子文件夹所有文件的名字和路径搜,python怎么读取某个文件夹下的全部文件,Python常见文件如何操作?。# -*-coding:utf8 -*- Python常见文件操作示例 os

资讯

pythondjangoweb部署(如何使用django搭建创建web)

阅读(38)

本文主要为您介绍pythondjangoweb部署,内容包括如何使用django搭建创建web,如何部署pythonweb程序,怎么用python进行web开发。有以下四种意思!英语里面单词的意思你要结合语句及文章,因为每个单词都有多种意思,你看你要的是哪一种1.而姜戈寿喜

资讯

python提取压缩文件(python怎样压缩和解压缩ZIP文件)

阅读(34)

本文主要为您介绍python提取压缩文件,内容包括python怎样压缩和解压缩ZIP文件,怎么样大比例的压缩文件?我看到人家的压缩包只有70兆,但是解压出,下好了客户端~~怎么装啊,好多压缩包!压到那里啊~~求谢!!爱问。python使用zipfile模块压缩和解

资讯

python图像定位(怎样利用Python进行图片分析)

阅读(39)

本文主要为您介绍python图像定位,内容包括怎样利用Python进行图片分析,如何采用Python读取一个图像,python图片打开方式。from PIL import Image ### 此处为导出包,注意字母大小写import os, os.path# 指明被遍历的文件

资讯

python文本框粘贴(python怎么复制粘贴?)

阅读(40)

本文主要为您介绍python文本框粘贴,内容包括python怎么复制粘贴?,怎么在输入框里复制粘贴发言?,复制文本拷过来呢?。复制粘贴的方法:在IDE里面鼠标选中之后ctrl+c,ctrl+v。1. Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpa

资讯

python入门测试教程(初学Python,想以后做自动化测试,如何学习?)

阅读(34)

本文主要为您介绍python入门测试教程,内容包括Python做软件自动化测试的入门提问,初学Python,想以后做自动化测试,如何学习?,零基础如何开始学习Python?如何入门?。1)学好python的第一步,就是马上到官网上下载一个python版本。2)下载完毕后,就

资讯

python两个数组去重(如何使用python将二维数组去重呢)

阅读(33)

本文主要为您介绍python两个数组去重,内容包括如何使用python将二维数组去重呢,如何使用python将二维数组去重呢,python函数如何返回多个变量。方案1:转化为虚数x=c[:,0]+c[:,1]*1jprint(转化为虚数:,x)print(虚数去重后:,np.unique(x))

资讯

python项目命名空间管理(Python语言中命名空间的使用?)

阅读(37)

本文主要为您介绍python项目命名空间管理,内容包括Python语言中命名空间的使用?,未能找到类型或命名空间名称"?Attribute&qu?,介绍一下C++的命名空间TR1~~~如题。如果一个命名声明为全局的,那么对它的所有引用和赋值会直接搜索包含这个模块

资讯

python多继承经典(Python为什么会引入多继承)

阅读(33)

本文主要为您介绍python多继承经典,内容包括Python为什么会引入多继承,Python的发展历程有知道的吗?介绍介绍呗,关于Python的定义你知道多少呢。按照面向对象的思想,多继承的存在是合理的。只是,多重继承很容易就会导致复杂度失控,所以有的语

资讯

python断言作用(自学python有什么用?找工作有人要不?)

阅读(37)

本文主要为您介绍python断言作用,内容包括python中的断言如何使用,自学python有什么用?找工作有人要不?,求、python语言的用途。首先要分析你自学他干啥,为了兴趣?那就不要问有啥用了。为了帮助你的工作?你看这就是一个作用为了找工作,好吧,你可

资讯

python打开文件夹内所有文件(Python常见文件如何操作?)

阅读(38)

本文主要为您介绍python打开文件夹内所有文件,内容包括python如何获取一个文件夹内包括子文件夹所有文件的名字和路径搜,python怎么读取某个文件夹下的全部文件,Python常见文件如何操作?。# -*-coding:utf8 -*- Python常见文件操作示例 os

资讯

pythondjangoweb部署(如何使用django搭建创建web)

阅读(38)

本文主要为您介绍pythondjangoweb部署,内容包括如何使用django搭建创建web,如何部署pythonweb程序,怎么用python进行web开发。有以下四种意思!英语里面单词的意思你要结合语句及文章,因为每个单词都有多种意思,你看你要的是哪一种1.而姜戈寿喜

资讯

python监控云平台(用python写的代码怎么搭建云平台实现)

阅读(48)

本文主要为您介绍python监控云平台,内容包括用python写的代码怎么搭建云平台实现,女UU要是扮演粉红女郎!,已是淘宝会员,如何激活支付宝?要怎么激活?。1 Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型。2 Python具有很