Python 多进程 多线程数据共享

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: Changhua Gong
from multiprocessing import Process, Queue
import os, time, random
‘‘‘
1. 我们平时from queue import Queue是线程对列,用于数据共享的,只能在线程之间进行使用;
2. from multiprocessing import Queue,是进程对列,用于进程间数据交换,实际中是在进程之间进行序列化和反序列化(pickle)
   完成数据交互的;
3. 线程之间修改同一份数据,需加锁,而进程间的数据传递,仅是传递(数据共享)。
‘‘‘
# 写数据进程执行的代码:
def write(q):
    print(‘Process to write: %s‘ % os.getpid())
    for value in [‘A‘, ‘B‘, ‘C‘]:
        print(‘Put %s to queue...‘ % value)
        q.put(value)  # 推送
        time.sleep(random.random())
# 读数据进程执行的代码:
def read(q):
    print(‘Process to read: %s‘ % os.getpid())
    while True:
        value = q.get(True)  # 获取
        print(‘Get %s from queue.‘ % value)
if __name__==‘__main__‘:
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()
    # 启动子进程pr,读取:
    pr.start()
    # 等待pw结束:
    pw.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    pr.terminate()
    
    
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: Changhua Gong
from multiprocessing import Process, Pipe
from time import sleep
from multiprocessing import freeze_support
‘‘‘
def Pipe(duplex=True):
    return Connection(), Connection()
说明个问题:Pipe仅能两个进程间的交互,类似电话线形式收发
‘‘‘
def run_A(conn):
    for i in range(3):
        conn.send("I am from run_A: %s" % i)
        sleep(0.3)
    for i in range(5):
        print(conn.recv())
def run_B(conn):
    for i in range(3):
        print(conn.recv())
    for i in range(5):
        conn.send("I am from run_B: %s" %  i)
        sleep(0.3)
if __name__ == "__main__":
    freeze_support()
    conn1, conn2 = Pipe()
    pA = Process(target=run_A, args=(conn1,))
    pB = Process(target=run_B, args=(conn2,))
    pA.start()
    pB.start()
    pA.join()
    pB.join()
时间: 2024-07-31 06:58:53

Python 多进程 多线程数据共享的相关文章

python 多进程/多线程/协程 同步异步

这篇主要是对概念的理解: 1.异步和多线程区别:二者不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段.异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情.实现异步可以采用多线程技术或则交给另外的进程来处理.多线程的好处,比较容易的实现了 异步切换的思想, 因为异步的程序很难写的.多线程本身程还是以同步完成,但是应该说比效率是比不上异步的. 而且多线很容易写, 相对效率也高. 2.异步和同步的区别:  在io等待的时候,同步不会切走,浪费了时间.异

python多进程多线程的区别

进程与线程 进程 进程模块,multiprocessing  的 Process 进程的创建 变量 =  Process(target = 指定函数,args = (1,))指定函数参数 这样我们就创建了一个进程,target 无需加括号! 我们通过 变量.start() 调用某进程, 然后使用:变量.join()阻塞母进程, 让母进程等待子进程执行完毕.否则就母进程先执行了, 那样就达不到我们想要的结果了. 有的时候有可能串行比并行要快,并行来回切换有可能用的时间更长! 假设中间有停顿的话,比

Python 多进程多线编程模板

一.Python 多进程多线程原理介绍 1. Python 全局解释器锁GIL a) Python的全局解释器锁GIL是互斥锁,能够防止本机多个线程一次执行Python字节码:由于CPython的内存管理在线程级别是不安全的(内存泄露),所以这个全局解释器锁是必须的.每个Python进程只能申请使用一个GIL锁,因此Python的多线程虽然是并发的但不能并行处理.Python的解释器每次只能执行一个线程,待GIL锁释放后再执行下一个线程,这样线程轮流被执行. b) Python2.x里,GIL的

(转)python多进程、多线程编程

1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令. 1.1.2 线程的工作方式 假设你正在读一本书,没有读完,你想休息一下,但是你想在回来时恢复到当时读的具体进度.有一个方法就是记下页数.行数与字数这三个数值,这

Python进阶 - 多线程多进程基础

线程是最小的运行单元,进程是最小的资源管理单元. 串行 就是传统意义上的,同步,顺序的意思 进程:计算机中一个程序在一个数据集上 一次动态执行的过程,主要包含三部分内容 01>程序:描述进程的功能以及处理流程 02>数据集:功能处理过程中需要的资源数据 03>进程控制:严格控制进程执行过程中的各种状态 通俗来说,一个进程就是计算机上正在运行的一个程序 一个软件程序要运行,需要将软件依赖的数据加载到内存中,通过CPU进行运算并按照程序定义的逻辑结构进行流程控制,直到数据处理完成后程序退出

Python的多线程和多进程模块对比测试

本文主要对比测试Python的多线程和多进程模块在CPU类型和I/O的任务操作时的效率 一 测试CPU消耗类型任务 在一台多核CPU的服务器上执行多线程代码,理论上代码执行时会利用多余的CPU核心来提升性能.但是由于Python的GIL的存在,使用多线程来执行CPU繁重的任务,未必能得到性能提升.但是GIL又必不可少,因为在Python解释器中执行线程是不安全的,也就是说为了保证Python线程执行时的安全,Python提供了一个全局锁,同一时刻,只允许一个线程获得这个全解锁并执行. CPU消耗

Python的多线程与多进程实践

最近要产生大量的”假“的电话号码,所以就写了一个自动产生电话号码程序,产生了一百万条数据,然后把数据放到一个文件中. 死跑版: # -*- coding: utf-8 -*- # 以下是中国的手机号码分段情况 # 新联通 (中国联通+中国网通)手机号码开头数字 130.131.132.145. # 155.156.185.186 # 新移动 (中国移动+中国铁通)手机号码开头数字 134.135.136.137. # 138.139.147.150.151.152.157.158.159.182

第十五章 Python多进程与多线程

15.1 multiprocessing multiprocessing是多进程模块,多进程提供了任务并发性,能充分利用多核处理器.避免了GIL(全局解释锁)对资源的影响. 有以下常用类: 类 描述 Process(group=None, target=None, name=None, args=(), kwargs={}) 派生一个进程对象,然后调用start()方法启动 Pool(processes=None, initializer=None, initargs=()) 返回一个进程池对象

关于Python和Java的多进程多线程计算方法对比

原文请见 关于Python和Java的多进程多线程计算方法对比 搞大数据必须要正视的一个问题就是并行计算.就像执行一件任务一样,大伙一起同时干,才有效率,才会很快出成果.正所谓"众人拾柴火焰高"~ 对于并行计算,有很多高大上的概念,我也不全懂.这里就单单罗列一下我对于多进程和多线程计算的理解和总结. 在计算机中,处理一个任务,可以在一个进程中,也可以在一个线程中,确切的说,执行的话都得靠一个个线程来.在我们做某件事的时候,往往需要同时干多个任务才能达到我们所要的效果,比如说看电影,就要