python多线程代码相同,在不同电脑上实现不了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多线程代码相同,在不同电脑上实现不了相关的知识,希望对你有一定的参考价值。

参考技术A 可以呀,你只要有相应的系统的 python虚拟机就行了。
还要看你代码写的兼容不兼容了,
比如在linux中文件目录和windows中是不一样的,你如果把路径这些东西硬编码了,那可能就会有点小问题,稍微注意一下就行了,python是跨平台的。
参考技术B apple tag 有效距离解释如下:
AirTag采用的是也是蓝压的原理,所以其有效距离差不多是 10米 。如果 AirTag 与物主分离且不在蓝牙范围内,“查找”网络也可以帮助追踪它。已经有接近 10 亿部 Apple 设备接入了“查找”网络,这个网络可以检测到丢失的 AirTag 发出的蓝牙信号,并以匿名和私密的方式,通过后台把它的位置发送给物主。用户还可以将 AirTag 设置为丢失模式,当它进入蓝牙范围内或被庞大的“查找”网络定位,物主将会收到通知。如果有其他人发现丢失的 AirTag,他们可以使用自己的 iPhone 或任何支持 NFC 功能的设备对其进行轻触,并进入一个网站;如果物主提供了联系电话,网站上将显示电话号码。

在Zephyr RTOS上实现一个轮询系统

近日在设计一个服务系统,使用的是RTOS,因为是实时操作系统,所以有时候需要进行切片,需要跑不同的任务,所以需要让它多线程起来,这里是我实现的一些思路,分享给大家,在实时RTOS上如何设计一款轮询系统,这里没有使用中断,使用的是Zephyr线程优先级的方式以及Zephyr Sleep时会发生线程切换的机制实现的,然后去执行其它任务。

在开发时需要保证你的线程不能陷入死循环,因为Zephyr中有一个时间片,这个时间片针对主线程(main)以外无效,针对线程时如果超出这个时间片,会将你的线程挂到后面重新排队,这样能确保其它线程也有执行的机会,因为Zephyr就是一个RTOS,理论上来说不应该有别的线程。

以下是我实现轮询系统里的部分代码,仅供在RTOS上设计轮询系统做参考:

函数原型

函数作用

调度函数,轮询系统,它的主要作用是为Task分配CPU时间,它不是使用中断实现的,它是使用Sleep的方式进行短暂沉睡。

函数调度

 

实现代码

代码分析

sc_main_loop函数的作用是到Task列表中去寻找一个状态就绪且时间戳最旧的一个Task任务,并为它分配一个新的时间戳然后返回,关于为什么要在获取Now的时间戳,这个时间戳是为了做比较,下面会做详细介绍。

 我们可以将sc_main_loop函数拆开看一下: 

首先它会先判断PB服务是否正在运行,如果在运行则为任务分配一个时间戳,输入时间是当前时间戳,然后返回的是:当前时间戳+要执行的时间(毫秒),如传递进去的是:1点35分42秒,返回的是1点35分45秒,其中加的三秒就是要执行的时间

下面这段代码可以看到for循环这段代码,在进行循环检测,如果这个Task的状态处于非SC_SENSOR_STATE_READY(未就绪)的状态就会忽略这个Task,开始新的遍历

如果当状态处于就绪的情况下,则判断这个Task的时间戳是否小于Now时间,如果小于当前时间则记录到准备时间戳列表里,遍历完成之后就会去这个里面找到时间戳最旧的那个Task然后执行它

 除此之外,还需要检查这个Task是否去调用了别的Task,如果调用了别的Task那么就需要产生依赖关系,优先执行调用的Task

最后要在判断当前的Task是否有FIFO任务,如果有FIFO在进行工作那么这个Task需要等待一段时间才能被执行,所以在执行前它需要稍微等待一会,等待的时间是当前时间加上一个最小的FIFO等待时间:10000毫秒,也就是这个Task在执行之前等待10000毫秒确保BUFF数据已经填满了,这样才能保证业务逻辑正常运行

最后它会进行判断,如果more_samples_this_cycle为True的情况下代表当前的任务需要等待,那么设置next_poll_time = 0,让轮询系统不延迟,重新选择一个Task,因为等待时间其实对于CPU来说可以做很多事情了,与其让其傻傻的等待不如重新选择一个Task去执行,当上一个任务的等待时间到了的时候再去执行它

如果这个任务不需要等待,more_samples_this_cycle是False的情况下则调用min函数从sc_calc_next_poll函数和next_poll_time里之间选一个最小的时间戳并返回

sc_calc_next_poll也是一个计算时间戳的函数,它的计算方式根据当前的时钟频率分频系数有关,PB是通过系统时钟的一些参数来分配的,它俩分配的时间戳算法都不一样,这段代码的目的是从两个计算时间戳的函数中选择一个最小的时间戳

如果没有任务的情况下next_poll_time是SAMPLE_TIME_MAX

当sc_main_loop里没有获取到任务时间时会返回SAMPLE_TIME_MAX,这代表当前没有任务

最后它还会获取一次当前最新的时间戳,这个时间戳是用于时间戳的比较

如果当前没有时间则会设置sleep_period_in_ms沉睡时间为-1,sleep_period_in_ms被设置成-1时,会进入长眠,直到被中断打断。

 

如果next_sampling_timestamp<=now的情况下,也就是sc_main_loop返回可能是0,那么认为这个Task可能需要等待,那么我们就重新选一个任务出来,这里设置延迟为0

如果大于当前时间戳的情况下才是代表有这个任务需要被调度了,因为sc_main_loop返回值是:当前时间戳+要执行的时间,所以一定大于当前时间戳,如果大于则延迟时间等于:返回时间戳减去当前时间戳就等于要执行的时间戳,为了防止时间戳过大还用三目运算符做了判断,如果过大则设置为LONG_MAX,防止数值溢出

 最后调用休眠函数:ish_wait_async_event,休眠时间就是sleep_period_in_ms,进入休眠后将控制权短暂交出去,当Sleep时间到了以后就会回到最高优先级的线程这边来继续轮询调度 

以上是关于python多线程代码相同,在不同电脑上实现不了的主要内容,如果未能解决你的问题,请参考以下文章

在具有相同种子的不同操作系统上实现相同的随机数序列

如何在 Android Activity 上实现多线程?

多线程

高手进,关于C语言在windows上建立多线程的问题(VC6.0上实现)

Java多线程

在Zephyr RTOS上实现一个轮询系统