当前位置: 首页 > news >正文

python多线程读取文件内容_python多线程读取logcat内容,导致其他线程阻塞

问题描述

背景:

通过adb读取安卓设备上的数据内容,包括logcat日志以及其他系统文件内容。实现方式是在python中启动多线程,每个线程中通过popen执行系统命令,如adb logcat -s tag:*,或者adb shell cat /proc/stat。

读取文件在communicate中等待返回结果,logcat由于是不断滚动输出,因此从流中逐行读取,即stdout.readline()

问题描述:

在实际运行中发现,logcat的popen会阻塞其他读取文件的popen;但logcat的线程中sleep 1秒后,再启动其他线程,则没有阻塞现象

相关代码

复现源码:

使用python2.7执行,需要提前连接好安卓手机,打开调试模式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64from subprocess import Popen, PIPE

import threading

from threading import Thread

import time

pid = 19622 # change to your pid in mobile

def run_logcat():

"""start logcat ,readline from logcat and print"""

print "start logcat thread , %s" % threading.currentThread().getName()

logcat = "adb logcat -v time "

cat_open = Popen(logcat, stdout=PIPE, stderr=PIPE, universal_newlines=True)

index = 0

while index < 20:

print threading.currentThread().getName()

print cat_open.stdout.readline()

time.sleep(1)

index += 1

print "index %s" % index

cat_open.terminate()

# cat_open.kill()

def run_sys():

print "start sys thread , %s" % threading.currentThread().getName()

index = 0

while True:

syst = "adb shell cat /proc/stat"

sys_open = Popen(syst, stdout=PIPE, stderr=PIPE, universal_newlines=True)

print threading.currentThread().getName() + str(index)

print sys_open.communicate()

print "sys open return code %d" % sys_open.returncode

time.sleep(1)

index += 1

if index > 20:

break

def run_proc():

print "start proc thread, %s" % threading.currentThread().getName()

index = 0

while True:

proc = "adb shell cat /proc/%s/stat" % pid

proc_open = Popen(proc, stdout=PIPE, stderr=PIPE, universal_newlines=True)

print threading.currentThread().getName() + str(index)

print proc_open.communicate()

print "proc open return code %s " % proc_open.returncode

time.sleep(1)

index += 1

if index > 20:

break

def run():

logcat_t = Thread(target=run_logcat, name="locat_thread")

proc_t = Thread(target=run_proc, name="proc_thread")

sys_t = Thread(target=run_sys, name="sys_thread")

logcat_t.start()

# time.sleep(1) # if start logcat first and slepp 1s, proc thread ad sys thread will not blck

# proc thread,and sys trhead is block

proc_t.start()

sys_t.start()

if __name__ == "__main__":

run()

bVbpikT?w=704&h=484

在网上找了一张adb 发送、传输指令的时序图,猜测可能是跟adb server有关。在多线程同时向adb server发送指令时,可能会导致后续指令阻塞。如果在python单线程顺序发送指令,或者多线程有sleep的情况下,则不会阻塞。

但是,阻塞在哪一步;阻塞情况怎样才会出现,却不是很清楚。

请问是哪个步骤导致阻塞?

相关文章:

  • python闭包满足的三个条件_Python中的闭包
  • javascript等待异步线程完成_程序员修神之路--问世间异步为何物?
  • python取随机数画图_python3测试工具开发快速入门教程1turtle绘图-4选择与随机数...
  • python中如何输入多行字符_python中怎么输入多行字符串
  • python饼图显示百分比_解决echarts饼图显示百分比,和显示内容字体及大小
  • java 二维数组定义长方体_47.二维数组的定义
  • zap 自定义日志格式_Go 每日一库之 zap
  • python接管已经打开ie浏览器_Python Webdriver 重新使用已经打开的浏览器实例
  • python 单例 多线程_python 单例模式
  • echarts绘制大数量折线图导致浏览器崩溃_现代浏览器内部机制
  • filestream读取文件_ASP.NET Core WebAPI文件下载
  • python怎么循环合并数组_python数组循环合并python执行系统命令四种方法比较
  • git pull 强制覆盖本地_用git简单粗暴地完成本地、服务器同步
  • github可视化工具_深度学习训练过程可视化(附github源码)
  • grep 与条件_【125】Linux 中 ps ef|grep和ps、grep详解
  • HashMap剖析之内部结构
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java中具有继承关系的类及其对象初始化顺序
  • k8s 面向应用开发者的基础命令
  • MySQL用户中的%到底包不包括localhost?
  • Vultr 教程目录
  • zookeeper系列(七)实战分布式命名服务
  • 百度地图API标注+时间轴组件
  • 构建工具 - 收藏集 - 掘金
  • 记录一下第一次使用npm
  • 蓝海存储开关机注意事项总结
  • 聊聊flink的TableFactory
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #{}和${}的区别?
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (06)金属布线——为半导体注入生命的连接
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (简单) HDU 2612 Find a way,BFS。
  • (十一)图像的罗伯特梯度锐化
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)Dubbo快速入门、介绍、使用
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)JAVA中的堆栈
  • (转)LINQ之路
  • (转载)从 Java 代码到 Java 堆
  • .describe() python_Python-Win32com-Excel
  • .form文件_一篇文章学会文件上传
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /dev下添加设备节点的方法步骤(通过device_create)
  • []串口通信 零星笔记
  • [1]-基于图搜索的路径规划基础