以串行对象作为参数的多进程

2024-03-25

我在使用 Python 并将串行对象作为参数传递给单独的进程时遇到问题。该程序在 Windows 8 中运行,因此不能选择使用全局变量。

from multiprocessing import Queue
from multiprocessing import Process
import os
import serial
from serial.tools import list_ports
from time import sleep

displayMessages = Queue()
modemPort = None

def processDisplayMessages(displayMessages):
    while True:
        msg = displayMessages.get()  #should halt until message in queue
        print msg

def processIncomingSerialMessages(modemPort, displayMessages):
    while True:
        line = modemPort.readline()
        displayMessages.put(line)

def main():
    print "Serial Send Test"
    Process(target=processDisplayMessages, args = (displayMessages,)).start()
    modemPort = serial.Serial('COM5', 57600, timeout=0.9)  # open first serial port
    Process(target=processIncomingSerialMessages, args = (modemPort, displayMessages)).start()
    print "Back from launch"

    sleep(0.1)

 if __name__ == '__main__':
    main()

当程序运行时,我收到以下错误:



Process Process-2:
Traceback (most recent call last):
  File "c:\python27\lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "c:\python27\lib\multiprocessing\process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\matthew.parets\Documents\..Development\RaspberryPi\windows\seri
alRecvPrototype.py", line 27, in processIncomingSerialMessages
    line = modemPort.readline()
  File "c:\python27\lib\site-packages\serial\serialwin32.py", line 246, in read
    if not self.hComPort: raise portNotOpenError
AttributeError: 'Serial' object has no attribute 'hComPort'
  

如果我将串行端口(modemPort)的打开位置作为 processIncomingSerialMessages 的第一行,则程序可以正常工作。问题是我需要将输入和输出与调制解调器解耦,因此我需要将串行对象作为参数传递。而Python似乎不喜欢这样。

任何人都可以看到我所犯的错误,或者任何人都可以提出替代方案吗?


我无法运行这段代码,但如果它有效,我会感到惊讶:跨进程传递的参数通过在发送端腌制参数对象,通过管道或套接字跨进程发送pickle字符串,然后取消腌制来工作。接收端的字符串。据我所知,没有任何开放的 I/O 类对象可以使用此方法(文件、套接字、管道...)。 I/O 类型的对象则不然just具有内部数据状态,它们还连接到 Python 本身未实现的资源。 pickle 只是一个原始字节流。

您已经知道必须在工作进程中打开串行端口。唉,我不知道“我需要将调制解调器的输入和输出解耦”是什么意思,所以很难提出解决方法。但我相信,如果您接受已经通过艰难的方式发现的事实,您就会明白:跨进程传递开放的串行对象永远不会起作用。

也就是说,您可以深入研究各种酸洗协议,并使用自定义酸洗/取消酸洗代码构建自己的类,这些代码在取消酸洗时(重新)打开串行对象。这将是一种隐藏在工作进程中(重新)打开串行对象的简单代码的复杂方法。

编辑:问答

而且 Windows 并没有提供摆脱全局变量的简单方法,所以我只能使用一个进程来处理发送和接收。

“全局变量”可能对你没有帮助。我假设你有fork()心里有数,但什么也没有shared across fork()要么: 子进程参见copies父进程的地址空间。 I/O 花招也经常无法正常工作。

Python 是否提供了一种通过引用传递值或向进程传递引用值的方法?我尝试将串行对象添加到列表和集合中,但结果相同。再说一遍,Python 是否提供了类似于 Java 中的对象或数组之类的东西,我可以通过它们获得引用,而无需对其进行“Pickled”?

所有现代操作系统中的进程之间都有很高的墙。为了让任何内容真正跨进程共享,您需要使用从头开始构建的类型,或者使用操作系统的“共享内存”设施。

您可以阅读文档multiprocessing.sharedctypes,它提供了使用共享(跨进程)内存的方法。但是,正如文档警告的那样:

笔记 尽管可以在共享内存中存储指针,但请记住,这将引用特定进程的地址空间中的位置。但是,该指针很可能在第二个进程的上下文中无效,并且尝试从第二个进程取消引用该指针可能会导致崩溃。

这是行不通的。这不是编程语言问题,而是操作系统问题。sharedctypes对于整数和浮点数组之类的东西很有用。

为了使该应用程序正常工作(实时遥测),接收过程必须始终保持活动状态。

抱歉,我没有在上下文中遵循这一点。您在问题中说:“如果我将串行端口(调制解调器端口)的打开位置作为 processIncomingSerialMessages 的第一行,则程序可以正常工作。”。processIncomingSerialMessages之后有一个无限循环。这在什么意义上违反了“接收过程必须始终保持活动状态”?

在您展示的代码中,它没有appear区分串行端口是在工作进程中打开还是在主进程中打开(如果后者确实有效),事实上,您说如果您按照前一种方式进行操作,它就可以正常工作。那么这样做究竟有什么问题呢?事实上,为什么要使用工作进程呢?您展示的主程序在启动两个工作程序后什么也不做(除了睡眠十分之一秒),那么为什么不让主程序be“接收过程”?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以串行对象作为参数的多进程 的相关文章

  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 当字段是数字时怎么说...在 mongodb 中匹配?

    所以我的结果中有一个名为 城市 的字段 结果已损坏 有时它是一个实际名称 有时它是一个数字 以下代码显示所有记录 db zips aggregate project city substr city 0 1 sort city 1 我需要修
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 如何以正确的方式为独立的Python应用程序制作setup.py?

    我读过几个类似的主题 但还没有成功 我觉得我错过或误解了一些基本的事情 这就是我失败的原因 我有一个用 python 编写的 应用程序 我想在标准 setup py 的帮助下进行部署 由于功能复杂 它由不同的 python 模块组成 但单独
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 如何使用 PrimaryKeyRelatedField 更新多对多关系上的类别

    Django Rest 框架有一个主键相关字段 http www django rest framework org api guide relations primarykeyrelatedfield其中列出了我的 IDmany to m
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的

随机推荐

  • ng-click 在动态创建的内容中不起作用

    我在 Angular 中有这个功能 我在其中添加了一个带有 ng click 的新幻灯片 var addSlide function scope slideIndex event slideIndex var slider angular
  • 通过 PHP 批量插入 MySQL 数据库会跳过名称

    我目前正在开发一个跟踪程序 可以同时跟踪数百个用户 但我遇到了一个有点烦人的问题 我让用户插入数据库的方法是通过 html 文本区域 然后将它们作为参数发送 总是有大约 60 人中的 7 人 也总是相同的名字 被插入到数据库中 但它没有插入
  • 创建具有不同单元格类型的分组 UITableview

    我需要创建一个分组的 uitableview 其中包括一些部分以及每个部分中可能不同的单元格类型 我正在尝试创建类似旧的 foursquare 应用程序 用户页面 包括 排行榜 朋友建议 朋友 统计数据 最探索的类别 部分 我对 ios 编
  • ASP.NET MVC 客户端验证

    我热衷于使用 ASP NET MVC 但我希望改进的领域之一是客户端验证 我知道最新版本 预览版 5 有很多用于验证的新功能 但它们似乎都是在页面发布之后 我看过一篇有趣的文章史蒂夫 桑德森 http blog codeville net
  • 没有这样的模块 Crashlytics - Pod 似乎丢失了

    我经常收到错误 No such module Crashlytics 我通常会花费数小时清理构建文件夹 重新安 装所有内容 运行 pod install 等来解决该问题 但我对此感到厌倦 并希望一劳永逸地解决该问题 我的 podfile 包
  • Mongoose 验证外键(参考)

    我尝试了几种不同的方法来验证 Mongoose 中的外键 但无法弄清楚 我有一个这样的架构 Doctors js var schema mongoose Schema email type String module exports mon
  • 使用 Django 上传表单清空 Request.FILES

    尝试使用非常简单的形式将文件上传到新的类实例中 我希望这两个文件都在request FILES但它是空的 我在捆绑的开发服务器上 被困在这里并解决了所有相关问题 wayfinder map media file request FILES
  • 复选框样式并使其选中

    从数据库检索到的复选框太长了 它是向下的 有什么办法使它成为四层 单击 所有字段 复选框时 必须选中所有复选框 这要怎么做呢 我的代码 protected function getConfigForm sql SELECT id order
  • 检查字符串中的字符是否都是唯一的

    我正在尝试使用 JS 通过数组来解决这个问题 var str abcdefgh for i 0 i lt 255 i arr i false function check for i 0 i lt str length i if arr s
  • 如何从实体管理器获取 jpa 数据源属性

    大家好 我想知道是否可以通过实体管理器获取数据库连接属性 我的 persistence xml 看起来像这样
  • 暂停事件在 PhoneGap iPhone 中无法正常工作?

    这是我的代码 This is an event that fires when a PhoneGap application is put into the background document addEventListener paus
  • Go 语言中的打印格式列表

    只是想知道使用 fmt 包的功能的打印格式列表 例如 v 用于打印值 T 可以打印值的类型 还有什么 动词 格式列表可在fmt 包的文档 http golang org pkg fmt General v the value in a de
  • 如何在.net6中使用WebApplicationFactory(没有可讲的入口点)

    在 ASP NET Core 6 中 默认模板将所有内容从Startup cs into Program cs 并使用 Program cs 中的顶级语句 因此不再有 可以说的 Program乙醚类 这看起来很棒 但现在 我需要测试所有这些
  • 在快速解析 Json 时无法将“NSNull”类型的值转换为“NSString”

    我有以下课程 class BannerResponse NSObject let URL Url let CONTACT NO ContactNo let IMAGE Image let BIG IMAGE BigImage let ID
  • 为什么 Evan 的调试器说我要转向 eax 而不是 rax?

    我正在将一些值移至 rax 但调试器显示它正在移至 eax 这是怎么回事 是用调试器 nasm 还是我的知识 无论如何 代码当然可以完美运行 我使用的调试器是 Evan s Debugger 简而言之 您和调试器都是正确的 当您将某物移动到
  • C++ 风格与性能?

    C 风格与性能 使用 C 风格的东西 比某些 C 等价物更快 这是不好的做法吗 例如 不要使用atoi itoa atol ETC 使用std stringstream 永远不要使用原始指针 而是使用智能指针 好吧 它们真的很有用 每个人都
  • QMediaplayer 无法在无框和半透明背景 PyQt5 上工作

    我正在使用 QMediaplayer 制作视频播放器 但它无法在无框和半透明背景窗口上工作 我想制作圆角窗口 所以我需要无框和半透明窗口 这是我的代码 from PyQt5 QtCore import Qt QUrl from PyQt5
  • Node.js 将图像通过管道传输到内存中并显示它

    我正在制作一个下载和显示图像的 Node js Electron 应用程序 我正在使用请求从互联网下载图像 我想将此图像保存在内存中并显示它 而不将文件保存在本地硬盘上 我知道我可以通过插入来完成我在这里提出的要求 img src url
  • 为什么初始化程序不能处理返回 list 的属性?

    找不到这个问题的答案 这一定是显而易见的 但仍然如此 我尝试在这个简化的示例中使用初始化程序 MyNode newNode new MyNode NodeName newNode Children Add smth mistake is h
  • 以串行对象作为参数的多进程

    我在使用 Python 并将串行对象作为参数传递给单独的进程时遇到问题 该程序在 Windows 8 中运行 因此不能选择使用全局变量 from multiprocessing import Queue from multiprocessi