python_并发编程——管道和数据共享

1.管道

from multiprocessing import Pipe

conn1,conn2 = Pipe()    #返回两个值
conn1.send(‘wdc‘)   #发送
print(conn2.recv()) #接收
conn2.send(‘yhf‘)
print(conn1.recv())

结果:~双向通信

2.在进程中传递数据

from multiprocessing import Pipe,Process

class Pr1(Process):
    def __init__(self,conn1):
        super().__init__()
        self.conn1 = conn1
    def run(self):
        self.conn1.send(‘吃了吗?‘)

if __name__ == ‘__main__‘:
    conn1,conn2 = Pipe()
    p = Pr1(conn1)
    p.start()
    print(conn2.recv())

结果:

 解决当管道内数据为空时,还在继续获取数据时造成的阻塞问题。

from multiprocessing import Pipe,Process

class Pr1(Process):
    def __init__(self,conn1,conn2):
        super().__init__()
        self.conn1 = conn1
        self.conn2 = conn2
    def run(self):
        self.conn2.close()  #关闭conn2
        while True:
            try:
                print(self.conn1.recv())
            except EOFError:    #当其他所有的conn端口都被关闭,只剩下一个conn端口还在获取管道内的数据,而管道内已经空了的时候就会报EOFError错误。
                self.conn1.close()   #关闭conn1
                break

if __name__ == ‘__main__‘:
    conn1,conn2 = Pipe()
    p = Pr1(conn1,conn2)
    p.start()
    conn1.close()   #关闭conn1
    for i in range(10):
        conn2.send(‘吃了吗?‘)
    conn2.close()  #关闭conn2

结果:输出10次数据,然后结束全部进程。

原文地址:https://www.cnblogs.com/wangdianchao/p/12079780.html

时间: 2024-10-28 14:08:24

python_并发编程——管道和数据共享的相关文章

python_并发编程——数据共享

1.数据共享 实现进程之间的数据共享 from multiprocessing import Manager,Process class MyPro(Process): def __init__(self,dic): super().__init__() self.dic = dic def run(self): self.dic['count'] -= 1 print(self.dic) if __name__ == '__main__': m = Manager() dic = m.dict

python_并发编程——多线程

1.多线程并发 from threading import Thread import time def func(n): time.sleep(1) print(n) for i in range(10): t = Thread(target=func,args=(i,)) #将函数注册进子线程,并传递参数 t.start() #启动子线程 结果:  2.另外一种启动多线程的方法 from threading import Thread import time class MyTread(Th

python并发编程(管道,事件,信号量,进程池)

管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pipe def f1(conn): from_zhujincheng = conn.recv() print('子进程') print('来自主进程的消息:',from_zhujincheng) if __name__ == '__main__': conn1,conn2 = Pipe() #创建一个管

Python并发编程-进程间数据共享

Manager中进程数据不安全 通过加锁解决 from multiprocessing import Manager,Process,Lock def main(dic,lock): lock.acquire() dic['count'] -=1 print(dic) lock.release() if __name__ == '__main__': m = Manager() l = Lock() dic = m.dict({'count':100}) #主进程中数据提供到子进程去操作 p_l

python_并发编程——多进程的第二种启动方式

1.多进程的第二种启动方式 import os from multiprocessing import Process # 创建一个自定义类,继承Process类 class MyProcess(Process): # 必须实现一个run方法,run方法中是子进程中执行的代码 def run(self): print('子进程:',os.getpid()) if __name__ == '__main__': print('主进程',os.getpid()) p1 = MyProcess() p

python_并发编程——锁

多进程模拟买票~ import time import json from multiprocessing import Process class Show(Process): #查 def run(self): with open('ticket') as f: dic = json.load(f) print("余票:{}".format(dic['ticket'])) class Buy_ticket(Process): #买 def __init__(self,name):

python_并发编程——进程池

1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '__main__': pool = Pool(3) #启动有三个进程的进程池. #第一个参数进程要访问的代码,第二个参数必须是一个可迭代参数,规定了要执行的任务数 pool.map(func,range(100)) #100个任务 结果: 每个数打印了10次. 2.进程池和多进程的用时对比 def f

python_并发编程——线程池

1.线程池 import time from concurrent.futures import ThreadPoolExecutor def func(n): time.sleep(2) print(n) t_pool = ThreadPoolExecutor(max_workers=5) # 创建线程池对象,设置线程池大小,建议不超过cpu数*5 for i in range(20): t_pool.submit(func,i) # 启动进程池,(执行的函数,传递的参数) 结果:每过两秒钟随

C++并发编程 02 数据共享

在<C++并发编程实战>这本书中第3章主要将的是多线程之间的数据共享同步问题.在多线程之间需要进行数据同步的主要是条件竞争. 1  std::lock_guard<std::mutex> #include <list> #include <mutex> #include <algorithm> std::list<int> some_list; std::mutex some_mutex; void add_to_list(int n