自学Python 57 多线程开发(七)使用 Connection对象和共享对象 Shared

​ Python 使用 Connection对象和共享对象 Shared

活动地址:CSDN21天学习挑战赛



  本文在多线程开发(五)和(六)的基础上继续学习multiprocessing模块中的内容。


一、使用 Connection对象

  在Python程序中,Connection 对象允许发送和接收可拾取对象或字符串,它们可以被认为是面向消息的连接套接字。例如在下面的实例文件中,演示了使用Connection对象处理数据的过程。

from multiprocessing import Pipe
a,b = Pipe()
a.send([1,'暑假要结束了!',None])
print(b.recv())
b.send_bytes(b'thank you')
print (a.recv_bytes())
import array
arr1 = array.array('i', range(5))
arr2 = array.array('i', [0] * 10)
a.send_bytes(arr1)
count = b.recv_bytes_into(arr2)
assert count == len(arr1) * arr1.itemsize
print(arr2)

  执行后会输出:
在这里插入图片描述

二、使用共享对象 Shared

  在 Python程序中,可以使用由子进程继承的共享内存创建共享对象,这样会返回从共享内存分配的ctypes对象。共享对象Shared主要句含加下所示的两个核心方法。
  (1) multiprocessing.Value(typecode_or_type,* args, lock=True)
  参数说明如下表所示。

参数名称描述
返回值在默认情况下,返回值实际上是对象的同步包装器。对象本身可以通过Value的值属性访问
参数typecode_or_type确定返回对象的类型,是ctypes类型或array模块使用的类型的一个字符类型代码
参数*args被传递给类型的构造函数
参数lock如果lock为 True(默认值),则创建一个新的递归锁对象,以同步对该值的访问。如果lock是 Lock或 RLock 对象,那么它将用于同步对该值的访问。如果lock是False,那么对返回对象的访问将不会被锁自动保护,因此它不一定是“进程安全的”

  (2)multiprocessing.Array(typecode_or_type, size_or_initializer,*, lock=True)
  参数说明如下表所示。

参数名称描述
返回值返回从共享内存分配的ctypes数组。在默认情况下,返回值实际上是数组的同步包装器
typecode_or_type确定返回数组的元素类型,是 ctypes类型或array模块使用的类型的一个字符类型代码
size_or_initializer如果size_or_initializer是一个整数,则它确定数组的长度,并且数组将初始置零。否则 size_or_initializer是用于初始化数组的序列,其长度决定了数组的长度
Lock如果lock为 True(默认值),则创建一个新的锁对象,以同步对该值的访问。如果lock是Lock或RLock对象,那么它将用于同步对该值的访问。如果lock是False,那么对返回的对象的访问将不会被锁自动保护,因此它不一定是“进程安全的”。请注意,lock是一个仅关键字的参数

  例如在下面的实例中,演示了使用 Shared 对象将共享内容创建共享ctypes对象的过程。

from multiprocessing import Process,Lock
from multiprocessing.sharedctypes import Value, Array
from ctypes import Structure,c_double
class Point(Structure):
    _fields_ = [('x', c_double),('y', c_double)]
def modify(n, x, s, A):
    n.value **= 2
    x.value **= 2
    s.value = s.value.upper()
    for a in A:
        a.x **= 2
        a.y **= 2
if __name__ == '__main__':
    lock = Lock()
    n = Value('i',7)
    x = Value(c_double, 1.0/3.0, lock=False)
    s = Array ('c', b'hello world', lock=lock)
    A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock)
    p = Process(target=modify, args=(n,x,s,A))
    p.start()
    p.join()
    print(n.value)
    print(x.value)
    print(s.value)
    print([(a.x, a.y) for a in A])

  执行后会输出:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的PyQt5中,处理多线程主要有三种方法。第一种是使用计时器模块QTimer,第二种是使用多线程模块QThread,第三种是使用事件处理功能。 在第二种方法中,需要编写一个线程类文件,并在其中定义一个自定义信号。然后在run()函数中编写希望在线程中执行的操作。例如,可以使用time.sleep()函数实现计时操作,并通过emit函数将参数传递给主线程,从而触发自定义信号。 在第三种方法中,需要导入前面两个文件,并定义一个包含相关逻辑操作的类。可以通过实例化一个线程,并设置参数,然后将线程的信号与UI主线程中的槽函数进行连接。最后,启动线程并接收通过emit传来的信息,执行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PYQT5实现多线程的方法](https://blog.csdn.net/GDUT_ZXM/article/details/121353212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [PyQt5自学记录(1)——PyQt5多线程实现详解](https://blog.csdn.net/qq_40784418/article/details/105398870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值