python:python的多进程

简介: python:python的多进程例子.

https://docs.python.org/3.6/library/multiprocessing.html#examples

从这里改造而来:


import time
from urllib import request
from multiprocessing import Process, Queue, current_process, freeze_support,cpu_count


def worker2(input, output):
    for func, args in iter(input.get, 'STOP'):
        result = nety(func, args)
        output.put(result)
def nety(func, args):
    result = func(args)
    return 'process: %s  done func:%s url:%s' % \
        (current_process().name, func.__name__, args)


def getUrl(url):
    res=request.urlopen(url)
    #return res.read().decode('UTF-8')
    return res


def test():
    NUMBER_OF_PROCESSES = cpu_count()*2
    urllist=['http://115.239.211.112/']*100
    TASKS3=[(getUrl, url) for url in urllist]

    # Create queues
    task_queue = Queue()
    done_queue = Queue()

    # Submit tasks
    '''
    for task in TASKS1:
        task_queue.put(task)
    '''
    for task in TASKS3:
        task_queue.put(task)
    # Start worker processes
    for i in range(NUMBER_OF_PROCESSES):
        Process(target=worker2, args=(task_queue, done_queue)).start()

    # Get and print results
    print('Unordered results:')
    for i in range(len(TASKS3)):
        print('\t', done_queue.get())
        
    # Tell child processes to stop
    for i in range(NUMBER_OF_PROCESSES):
        task_queue.put('STOP')


if __name__ == '__main__':
    freeze_support()
    startTime=time.time()
    test()
    endTime=time.time()
    print(endTime-startTime)



改进版本:



import time
from urllib import request
from multiprocessing import Process, Queue, current_process,cpu_count,freeze_support
import os

def worker2(queueIn, queueOut):
    for func, args in iter(queueIn.get, 'STOP'):
        result = netty(func, args)
        queueOut.put(result)


def netty(func, args):
    result = func(args)
    #return ('process: %s  done func:%s url:%s' % (current_process().name, func.__name__, args),result)
    return (args, result) #返回传入的参数和输出的结果

def getUrl(url):
    res=request.urlopen(url)
    #return res.read().decode('UTF-8')
    return res.read()


def test():
    NUMBER_OF_PROCESSES = cpu_count()*1
    #urllist=['http://192.168.199.119:8080/']*10
    urllist = []
    urlFileName = 'urls\\urls.txt'
    with open(urlFileName,'r') as f:
        for line in f.readlines():
            urllist.append(line.replace('\n',''))
    urllist = urllist*5



    TASKS3 = [(getUrl, url) for url in urllist]

    # Create queues
    task_queue = Queue()
    done_queue = Queue()

    # Submit tasks
    for task in TASKS3:
        task_queue.put(task)
    # Start worker processes
    for i in range(NUMBER_OF_PROCESSES):
        Process(target=worker2, args=(task_queue, done_queue)).start()

    # Get and print results
    print('Unordered results:')
    for i in range(len(TASKS3)):
        # print(done_queue.get())
        res=done_queue.get()
        url=res[0]
        data=res[1]
        #fileName = 'DATA\\'+url[7:].replace('/', '').replace(':', '_')+'_'+str(i)+'.txt'
        #fileName='DATA\\'+'data'+str(i)+'.data'
        fileName='DATA\\'+os.path.basename(url).replace('?','_')+'_'+str(i)+'.data'
        with open(fileName,'wb') as f:
            f.write(data)
    # Tell child processes to stop
    for i in range(NUMBER_OF_PROCESSES):
        task_queue.put('STOP')


if __name__ == '__main__':
    freeze_support()
    startTime = time.time()
    test()
    endTime = time.time()
    print(endTime-startTime)


目录
相关文章
|
4天前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
15 3
|
23天前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
45 3
|
1天前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
7 0
|
1月前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
48 10
|
9天前
|
数据采集 消息中间件 Python
Python爬虫-进程间通信
Python爬虫-进程间通信
10 0
|
1月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
35 1
|
1月前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
19 3
|
1月前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
54 5
|
1月前
|
消息中间件 Kafka 数据安全/隐私保护
Python IPC实战指南:构建高效稳定的进程间通信桥梁
【9月更文挑战第11天】在软件开发中,随着应用复杂度的提升,进程间通信(IPC)成为构建高效系统的关键。本文通过一个分布式日志处理系统的案例,介绍如何使用Python和套接字实现可靠的IPC。案例涉及定义通信协议、实现日志发送与接收,并提供示例代码。通过本教程,你将学会构建高效的IPC桥梁,并了解如何根据需求选择合适的IPC机制,确保系统的稳定性和安全性。
45 5
|
1月前
|
消息中间件 网络协议 Python
工具人逆袭!掌握Python IPC,让你的进程从此告别单打独斗
【9月更文挑战第9天】你是否曾遇到多个Python程序像孤岛般无法通信,导致数据孤立、任务难协同的问题?掌握进程间通信(IPC)技术,可助你打破这一僵局。IPC是不同进程间传递数据或信号的机制,在Python中常用的方法有管道、消息队列、共享内存及套接字等。其中,管道适用于父子或兄弟进程间简单数据传递;套接字则不仅限于本地,还能在网络间实现复杂的数据交换。通过学习IPC,你将能设计更健壮灵活的系统架构,成为真正的编程高手。
23 3