readline

Process.waitFor()导致主线程堵塞问题

僤鯓⒐⒋嵵緔 提交于 2020-04-27 17:05:37
今日开发的时候使用jdk自带的运行时变量 RunTime.getRunTime() 去执行bash命令。 因为该bash操作耗时比较长,所以使用了Process.waitFor()去等待子线程运行结束。 这个时候发现程序卡在waitFor()没有继续往下执行。 看了官方解释: waitFor:等待子进程执行结束,或者已终止子进程,此方法立即返回。 当RunTime对象调用exec方法后,jvm会创建一个子进程,该子进程与jvm建立三个管道连接:标准输入流、标准输出流、标准错误流。假设该子进程不断向标准输入流、标准输出流写数据,而jvm不读取的话,会导致缓冲区塞满而无法继续写数据,最终堵塞在waitFor这里。 知道了问题所在就好处理了, 我们只需要将子进程返回的信息从缓冲区读取出来,便可以避免主线程堵塞问题。 public static void main(String[] args){ Process proc = RunTime.getRunTime().exec("sh /home/winnie/dataExtract.sh") // 标准输入流(必须写在 waitFor 之前) String inStr = consumeInputStream(proc.getInputStream()); // 标准错误流(必须写在 waitFor 之前) String errStr =

java调用process线程阻塞问题

老子叫甜甜 提交于 2020-04-27 17:04:06
背景 项目需求中涉及java调用.bat文件进行图像处理,先直接上简略版程序 1 public void draw(){ 2 3 // 调用bat脚本进行图像处理 4 Process process = null ; 5 InputStream in = null ; 6 try { 7 process = Runtime.getRuntime().exec( " startup.bat " ); 8 9 // 输出测试 10 // in = process.getInputStream(); 11 // String line; 12 // BufferedReader br = new BufferedReader(new InputStreamReader(in)); 13 // while ((line = br.readLine()) != null) { 14 // System.out.println(line); 15 // } 16 17 // 等待 18 process.waitFor( ); 19 20 } catch (Exception e) { 21 22 } finally { 23 process.destroy(); 24 } 25 } JAVA使用遇到的问题描述   一般需要调用系统命令时,大部分人第一反应肯定是使用Runtime

python实例 ---- 简单的HttpServer

柔情痞子 提交于 2020-04-27 11:42:33
通常地我们要在不同平台间共享文件,samba,ftp,cifs,ntfs的设置都是有点复杂的, 我们可以使用python提供的httpserver来提供基于http方式跨平台的文件共享。 一 命令行启动简单的httpserver 进入到web或要共享文件的根目录,然后执行(貌似在python32中此module不存在了): python -m SimpleHTTPServer 8000 然后你就可以使用 http://你的IP地址:8000/来访问web页面或共享文件了。 二 代码启动httpserver simplehttpservertest.py import sys import locale import http.server import socketserver addr = len(sys.argv) < 2 and " localhost " or sys.argv[1] port = len(sys.argv) < 3 and 80 or locale.atoi(sys.argv[2]) handler = http.server.SimpleHTTPRequestHandler httpd = socketserver.TCPServer((addr, port), handler) print ( " HTTP server is at: http://

NO.2:自学python之路------变量类型、列表、字典

人盡茶涼 提交于 2020-04-27 06:29:50
引言 本周初步认识了库,并学习了Python中各种类型的变量和常用操作。并完成了较为完善的用户与商家购物界面设计。 正文 模块:   Python有标准库和第三方库。第三方库需要安装才能使用。大量的库可以帮助我们更容易的完成复杂的操作。一般情况下,标准库被保存在了‘lib/’目录下,第三方库被保存在了‘lib/site-packages’目录下。导入一个库非常简单,例子: import os   每种模块都有很多操作,一般情况是用模块名.操作名完成某些操作,例子: os.system( ' dir ' ) # 读取目录下的文件列表,但不保存 变量类型:   整型(int),Python 3.X中整型只有int型,而在Python 2.X中整型分为int,和long,变量的类型不需定义,与Matlab中类似,但类型不可随意更改。查看变量类型,例子: x = 3 type(x)   其他类型与C++中类似,所以不再赘述。   虚数型,在Python中j表示虚数。   比特型(bytes),Python 2.X中比特型与字符型没有区别,而在Python 3.X中存在不同,它们可以互相转换,例子: x = ' 我爱中国 ' y = x.encode() # 转换为比特型 print (y) z = y.decode()) # 转换为字符型 print (z)   在日常使用Python中

聊聊多线程那一些事儿(task)之 三 异步取消和异步方法

瘦欲@ 提交于 2020-04-26 12:24:33
  hello,咋们又见面啦,通过前面两篇文章的介绍,对task的创建、运行、阻塞、同步、延续操作等都有了很好的认识和使用,结合实际的场景介绍,这样一来在实际的工作中也能够解决很大一部分的关于多线程的业务,但是只有这一些是远远不够的,比如,比如,如果这么一个场景,当开启tsak异步任务后,有某个条件触发,需要终止tsak的执行又该如何实现呢?这一些问题正是我们今天需要交流分享的部分,带着这一些问题,咱们共同进入到今天的主题,谢谢! 在进入主题前,如果你没有阅读前面的两篇文章,欢迎您点击下面地址先阅读一下,这样能够更加连贯的掌握了解今天的内容,谢谢!    第一篇: 聊聊多线程哪一些事儿(task)之 一创建运行与阻塞  第二篇: 聊聊多线程哪一些事儿(task)之 二 延续操作  第三篇: 聊聊多线程那一些事儿(task)之 三 异步取消和异步方法  第四篇: 聊聊多线程那一些事儿 之 四 经典应用(取与舍、动态创建) Task之任务取消:CancellationTokenSource 关于线程取消,我相信大家在实际工作中都会遇到这样的问题,无论是采用哪一种方式实现异步线程,都会有相应的机制来取消线程操作。本次将同时对Thread的线程取消实现,Tsak的线程取消实现同时通过实例说明。 在我的工作经验中,需要取消异步线程作业的实际使用场景往往是一些异步作业程序,也就是一些周期性的

Kafka .net 开发入门

淺唱寂寞╮ 提交于 2020-04-26 07:32:39
  Kafka安装   首先我们需要在windows服务器上安装kafka以及zookeeper,有关zookeeper的介绍将会在后续进行讲解。 在网上可以找到相应的安装方式,我采用的是腾讯云服务器,借鉴的是 https://www.cnblogs.com/lnice/p/9668750.html 根据上面博客安装完成后,我们在kafka中新建了一个名叫test的Topic,并新建了一个生产者和一个消费者。   注:控制台生产者和控制台消费者的数据不同是因为我用 .net开发了一个生产者所致,后面会讲      .net生产者      当前市面上比较好的 .NET的 kafka开源包有两个: kafka-net和 rdkafka,我采用的是 RdKafka;   新建项目后首先添加 Nuget包,我的生产者源码如下所示 1 string brokerList = " 118.24.184.36:9092 " ; 2 string topicName = " test " ; 3 4 5 using (Producer producer = new Producer( " 118.24.184.36:9092 " )) 6 using (Topic topic = producer.Topic(topicName)) 7 { 8 Console.WriteLine( " { "

Java输入某年某月某日,判断这一天是这一年的第几天?

霸气de小男生 提交于 2020-04-26 04:26:55
分析: 大家都知道,每年的总共日期,要么就是365天,要么就是366天,具体是取决于闰年还是平年,更确切的说就是每年二月是28天还是29天,归结到这个问题,有一个关键的认识点,就是求解这一年是闰年(366天)还是平年(365天)。 平年还是闰年计算算法: 1. 年份能被4整除,但不能被100整除; 2. 能被400整除 下面给出具体算法: package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 题目:输入某年某月某日,判断这一天是这一年的第几天? */ public class NaYiTian { public static void main(String[] args){ BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); try { //录入键盘的数据 String str=bf.readLine(); //分割年月日 String[] strArr=str.split("-"); int year=Integer.parseInt(strArr[0]); int month=Integer.parseInt

Java--缓冲流详解

若如初见. 提交于 2020-04-24 16:43:00
Java--缓冲流详解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流 : BufferedInputStream , BufferedOutputStream 字符缓冲流 : BufferedReader , BufferedWriter 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。 字节缓冲流 构造方法 public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。 public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。 构造举例,代码如下: // 创建字节缓冲输入a BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt")); // 创建字节缓冲输出流 BufferedOutputStream bos = new BufferedOutputStream(new

探索c#之Async、Await剖析

↘锁芯ラ 提交于 2020-04-24 15:52:54
阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async、Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下。 APM方式,BeginGetRequestStream需要传入回调函数,线程碰到BeginXXX时会以非阻塞形式继续执行下面逻辑,完成后回调先前传入的函数。 HttpWebRequest myReq =(HttpWebRequest)WebRequest.Create("http://cnblogs.com/"); myReq.BeginGetRequestStream(); //to do Async方式,使用Async标记Async1为异步方法,用Await标记GetRequestStreamAsync表示方法内需要耗时的操作。主线程碰到await时会立即返回,继续以非阻塞形式执行主线程下面的逻辑。当await耗时操作完成时,继续执行Async1下面的逻辑 static async void Async1() { HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://cnblogs.com/"); await myReq.GetRequestStreamAsync(); //to do }

使用python依次读取文件中的所有csv格式的数据

自古美人都是妖i 提交于 2020-04-24 13:35:10
使用python依次读取文件中的所有csv格式的数据: #coding=gbk import pandas as pd import os path = r'D:\ml_datasets\PHM\c6' def get_file (): #创建一个空列表 files =os.listdir(path) files.sort() #排序 list= [] for file in files: if not os.path.isdir(path +file): #判断该文件是否是一个文件夹 f_name = str(file) # print(f_name) tr = '\\' #多增加一个斜杠 filename = path + tr + f_name list.append(filename) return list list = get_file() print( '\\') print(list[: 6]) data = pd.read_csv(list[ 2]) print(data.head()) 接下里就可以对 list 进行循环读取每个文件了。 输出为: #输出为: # \ # ['D:\\ml_datasets\\PHM\\c6\\c_6_001.csv', 'D:\\ml_datasets\\PHM\\c6\\c_6_002.csv', 'D:\\ml