背景:Python脚本:读取文件中每行,放入列表中;循环读取列表中的每个元素,并做处理操作。

核心:多线程处理单个for循环函数调用

模块:threading

第一部分:

:多线程脚本 (该脚本只有两个线程,t1循环次数

#!/usr/bin/env python

#-*- coding: utf8 -*-

import sys

import time

import string

import threading

import datetime

fileinfo = sys.argv[1]

# 读取文件内容放入列表

host_list = []

port_list = []

# 定义函数:读取文件内容放入列表中

def CreateList():

f = file(fileinfo,'r')

for line in f.readlines():

host_list.append(line.split(' ')[0])

port_list.append(line.split(' ')[1])

return host_list

return port_list

f.close()

# 单线程 循环函数,注释掉了

#def CreateInfo():

# for i in range(0,len(host_list)): # 单线程:直接循环列表

# time.sleep(1)

# TimeMark = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

# print "The Server's HostName is %-15s and Port is %-4d !!! [%s]" % (host_list[i],int(port_list[i]),TimeMark)

#

# 定义多线程循环调用函数

def MainRange(start,stop): #提供列表index起始位置参数

for i in range(start,stop):

time.sleep(1)

TimeMark = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

print "The Server's HostName is %-15s and Port is %-4d !!! [%s]" % (host_list[i],int(port_list[i]),TimeMark)

# 执行函数,生成列表

CreateList()

# 列表分割成:两部分 mid为列表的index中间位置

mid = int(len(host_list)/2)

# 多线程部分

threads = []

t1 = threading.Thread(target=MainRange,args=(0,mid))

threads.append(t1)

t2 = threading.Thread(target=MainRange,args=(mid,len(host_list)))

threads.append(t2)

for t in threads:

t.setDaemon(True)

t.start()

t.join()

print "ok"

以上是脚本内容!!!

----------------------------------------------------------------------

:读取文件的内容

文件内容:

[root@monitor2 logdb]# cat hostinfo.txt

192.168.10.11 1011

192.168.10.12 1012

192.168.10.13 1013

192.168.10.14 1014

192.168.10.15 1015

192.168.10.16 1016

192.168.10.17 1017

192.168.10.18 1018

192.168.10.19 1019

192.168.10.20 1020

192.168.10.21 1021

192.168.10.22 1022

192.168.10.23 1023

192.168.10.24 1024

192.168.10.25 1025

:输出结果:

单线程 : 执行脚本:输出结果:

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

The Server's HostName is 192.168.10.10 and Port is 1010 !!! [2017-01-10 14:25:14]

The Server's HostName is 192.168.10.11 and Port is 1011 !!! [2017-01-10 14:25:15]

The Server's HostName is 192.168.10.12 and Port is 1012 !!! [2017-01-10 14:25:16]

.

.

.

The Server's HostName is 192.168.10.25 and Port is 1025 !!! [2017-01-10 14:25:29]

多线程:执行脚本:输出 结果

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

The Server's HostName is 192.168.10.11 and Port is 1011 !!! [2017-01-10 14:51:51]

The Server's HostName is 192.168.10.18 and Port is 1018 !!! [2017-01-10 14:51:51]

The Server's HostName is 192.168.10.12 and Port is 1012 !!! [2017-01-10 14:51:52]

The Server's HostName is 192.168.10.19 and Port is 1019 !!! [2017-01-10 14:51:52]

The Server's HostName is 192.168.10.13 and Port is 1013 !!! [2017-01-10 14:51:53]

The Server's HostName is 192.168.10.20 and Port is 1020 !!! [2017-01-10 14:51:53]

The Server's HostName is 192.168.10.14 and Port is 1014 !!! [2017-01-10 14:51:54]

The Server's HostName is 192.168.10.21 and Port is 1021 !!! [2017-01-10 14:51:54]

The Server's HostName is 192.168.10.15 and Port is 1015 !!! [2017-01-10 14:51:55]

The Server's HostName is 192.168.10.22 and Port is 1022 !!! [2017-01-10 14:51:55]

The Server's HostName is 192.168.10.16 and Port is 1016 !!! [2017-01-10 14:51:56]

The Server's HostName is 192.168.10.23 and Port is 1023 !!! [2017-01-10 14:51:56]

The Server's HostName is 192.168.10.17 and Port is 1017 !!! [2017-01-10 14:51:57]

The Server's HostName is 192.168.10.24 and Port is 1024 !!! [2017-01-10 14:51:57]

The Server's HostName is 192.168.10.25 and Port is 1025 !!! [2017-01-10 14:51:58]

==================================以上部分完结===正确=========

=====经过调试出现新的问题======================================

第二部分:延伸问题

总结:以上运行结果没有问题!!!(但是调整参数:start,stop之后有问题:MainRange(start,stop))

首先说明下两个概念问题:

join():

1.方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程(主进程指:本脚本中的print “OK”)。

2.可以理解成:t.join() 的t线程执行完之后,再继续执行后面的!!!(本脚本中的t.join(),是指t2线程)

可参考:

for i in range(0,4):

pass

print i

结果输出:3. 也就是for循环的最后一个i. 放在本脚本里,就是for循环的最后一个线程t2。然后t2完成之后,就是:print “OK”

setDaemon(True):

1.将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。

2.换句话说:开启,子线程不会挂起,主线程执行了,子线程及时没执行完也会中断:比如本脚本里如果:t1>t2

===========解析=============================================================

重新编写输出文件内容:

[root@monitor2 logdb]# cat hostinfo.txt

192.168.10.00 0

192.168.10.01 1

192.168.10.02 2

192.168.10.03 3

192.168.10.04 4

192.168.10.05 5

192.168.10.06 6

192.168.10.07 7

192.168.10.08 8

192.168.10.09 9

192.168.10.10 10

192.168.10.11 11

192.168.10.12 12

192.168.10.13 13

192.168.10.14 14

原文脚本中:

for t in threads:

t.setDaemon(True)

t.start()

t.join()

print "ok"

分类解析:

基于原文脚本:

1. 以上基于线程执行次数:t1 <= t2  运行结果:正确

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

The Server's HostName is 192.168.10.00 and Port is 00 !!! [2017-01-10 19:08:44],

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:08:44],

The Server's HostName is 192.168.10.01 and Port is 01 !!! [2017-01-10 19:08:45],

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:08:45],

The Server's HostName is 192.168.10.02 and Port is 02 !!! [2017-01-10 19:08:46],

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:08:46],

The Server's HostName is 192.168.10.03 and Port is 03 !!! [2017-01-10 19:08:47],

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:08:47],

The Server's HostName is 192.168.10.04 and Port is 04 !!! [2017-01-10 19:08:48],

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:08:48],

The Server's HostName is 192.168.10.05 and Port is 05 !!! [2017-01-10 19:08:49],

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:08:49],

The Server's HostName is 192.168.10.06 and Port is 06 !!! [2017-01-10 19:08:50],

The Server's HostName is 192.168.10.13 and Port is 13 !!! [2017-01-10 19:08:50],

The Server's HostName is 192.168.10.14 and Port is 14 !!! [2017-01-10 19:08:51],

ok

解析:开启setDaemon(True),t1,t2同时依次执行,[t1,t2],[t1,t2],[t1,t2],[t1,t2],[t1,t2] . . . . . .[t1,t2], 下次循环t1结束,t2再执行一次,[,t2],再下次,t2结束。t.join()==t2.join() 完成任务,继续执行主进程print “ok”

2.基于脚本中线程次数t1>t2,运行结果:错误

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

t1: (0~13)

t2: (7~15)

The Server's HostName is 192.168.10.00 and Port is 00 !!! [2017-01-10 19:18:58],

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:18:58],

The Server's HostName is 192.168.10.01 and Port is 01 !!! [2017-01-10 19:18:59],

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:18:59],

The Server's HostName is 192.168.10.02 and Port is 02 !!! [2017-01-10 19:19:00],

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:19:00],

The Server's HostName is 192.168.10.03 and Port is 03 !!! [2017-01-10 19:19:01],

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:19:01],

The Server's HostName is 192.168.10.04 and Port is 04 !!! [2017-01-10 19:19:02],

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:19:02],

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:19:03],

The Server's HostName is 192.168.10.05 and Port is 05 !!! [2017-01-10 19:19:03],

The Server's HostName is 192.168.10.13 and Port is 13 !!! [2017-01-10 19:19:04],

The Server's HostName is 192.168.10.06 and Port is 06 !!! [2017-01-10 19:19:04],

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:19:05],

The Server's HostName is 192.168.10.14 and Port is 14 !!! [2017-01-10 19:19:05],

ok

解析:t1,t2同时依次执行,t1>t2,当t2执行最后一次时,t.join()===t2.join(),t.join()完成任务,执行主程序print "ok",由于:开启setDaemon(True),t1,t2均不会被挂起,主程序结束,子程序即使没有执行完,也结束。如上述结果。

t2执行8次结束,t1也执行8次循环结束。

开启:t.setDaemon(True):不会挂起,顺序执行

1.脚本如下:

for t in threads:

t.setDaemon(True)

t.start()

t.join()   #在for循环里面

print "ok"

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

t1: (0~13)

t2: (7~15)

The Server's HostName is 192.168.10.00 and Port is 00 !!! [2017-01-10 19:30:56]

The Server's HostName is 192.168.10.01 and Port is 01 !!! [2017-01-10 19:30:57]

The Server's HostName is 192.168.10.02 and Port is 02 !!! [2017-01-10 19:30:58]

The Server's HostName is 192.168.10.03 and Port is 03 !!! [2017-01-10 19:30:59]

The Server's HostName is 192.168.10.04 and Port is 04 !!! [2017-01-10 19:31:00]

The Server's HostName is 192.168.10.05 and Port is 05 !!! [2017-01-10 19:31:01]

The Server's HostName is 192.168.10.06 and Port is 06 !!! [2017-01-10 19:31:02]

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:31:03]

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:31:04]

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:31:05]

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:31:06]

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:31:07]

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:31:08]

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:31:09]

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:31:10]

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:31:11]

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:31:12]

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:31:13]

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:31:14]

The Server's HostName is 192.168.10.13 and Port is 13 !!! [2017-01-10 19:31:15]

The Server's HostName is 192.168.10.14 and Port is 14 !!! [2017-01-10 19:31:16]

ok

:解析:t.join()在for循环里面,t1.join()等待t1执行13次循环完毕;然后才执行t2,t2.join()等待t2循环执行8次;然后执行主线程print"ok"

:如上述结果:t1先执行完,再执行t2

:t1,t2大小无所谓,多线程没有效果

关闭:t.setDaemon(True) :线程会挂起

1.脚本如下:

for t in threads:

#  t.setDaemon(True)

t.start()

t.join()   #在for循环里面

print "ok"

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

t1: (0~13)

t2: (7~15)

The Server's HostName is 192.168.10.00 and Port is 00 !!! [2017-01-10 19:37:11]

The Server's HostName is 192.168.10.01 and Port is 01 !!! [2017-01-10 19:37:12]

The Server's HostName is 192.168.10.02 and Port is 02 !!! [2017-01-10 19:37:13]

The Server's HostName is 192.168.10.03 and Port is 03 !!! [2017-01-10 19:37:14]

The Server's HostName is 192.168.10.04 and Port is 04 !!! [2017-01-10 19:37:15]

The Server's HostName is 192.168.10.05 and Port is 05 !!! [2017-01-10 19:37:16]

The Server's HostName is 192.168.10.06 and Port is 06 !!! [2017-01-10 19:37:17]

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:37:18]

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:37:19]

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:37:20]

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:37:21]

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:37:22]

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:37:23]

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:37:24]

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:37:25]

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:37:26]

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:37:27]

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:37:28]

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:37:29]

The Server's HostName is 192.168.10.13 and Port is 13 !!! [2017-01-10 19:37:30]

The Server's HostName is 192.168.10.14 and Port is 14 !!! [2017-01-10 19:37:31]

ok

解析:由于t.join()在循环里面,所以:t1线程执行完,才执行t2.是顺序执行的

t1,t2大小无所谓,多线程没有效果

2.脚本如下:

for t in threads:

#  t.setDaemon(True)

t.start()

t.join()   #在for循环外面

print "ok"

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

t1: (0~13)

t2: (7~15)

The Server's HostName is 192.168.10.00 and Port is 00 !!! [2017-01-10 19:40:31]

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:40:31]

The Server's HostName is 192.168.10.01 and Port is 01 !!! [2017-01-10 19:40:32]

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:40:32]

The Server's HostName is 192.168.10.02 and Port is 02 !!! [2017-01-10 19:40:33]

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:40:33]

The Server's HostName is 192.168.10.03 and Port is 03 !!! [2017-01-10 19:40:34]

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:40:34]

The Server's HostName is 192.168.10.04 and Port is 04 !!! [2017-01-10 19:40:35]

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:40:35]

The Server's HostName is 192.168.10.05 and Port is 05 !!! [2017-01-10 19:40:36]

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:40:36]

The Server's HostName is 192.168.10.06 and Port is 06 !!! [2017-01-10 19:40:37]

The Server's HostName is 192.168.10.13 and Port is 13 !!! [2017-01-10 19:40:37]

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 19:40:38]

The Server's HostName is 192.168.10.14 and Port is 14 !!! [2017-01-10 19:40:38]

ok

The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 19:40:39]

The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 19:40:40]

The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 19:40:41]

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 19:40:42]

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 19:40:43]

解析:t.join()在循环外面t.join()==t2.join(),

过程:t1>t2. 开始:同时执行。当t2执行8次循环完毕,t1也执行了8次。此时t2完毕,t.join()生效,会执行主进程print "ok". 主进程完毕。

由于,关闭:t.setDaemon(True),未执行完毕的t1先前被挂起,接下来会继续,直到结束。如上述结果

t1

=============解决方法================================

解决方式:

1.只有两个线程时

修改原脚本:临时解决t1>t2

for t in threads:

t.setDaemon(True)

t.start()

threads[0].join()   #指定t1,结束

print "ok"

解析:通过threads[0] 指定t1.join() ,等t1完成了,才执行主程序

2.多个线程时 也适用

for t in threads:

t.start()

for t in threads:

t.join()

print "ok"

解析:多个线程都等待,等所有都完成之后。才执行主线程print "ok"

3.事例:3个线程

[root@monitor2 logdb]# ./Threadfor.py hostinfo.txt

t1: (0~4)  循环4次

t2: (4~11) 循环7次

t3: (11~15) 循环4次

The Server's HostName is 192.168.10.00 and Port is 00 !!! [2017-01-10 20:07:31]

The Server's HostName is 192.168.10.04 and Port is 04 !!! [2017-01-10 20:07:31]

The Server's HostName is 192.168.10.11 and Port is 11 !!! [2017-01-10 20:07:31]   1次

The Server's HostName is 192.168.10.01 and Port is 01 !!! [2017-01-10 20:07:32]

The Server's HostName is 192.168.10.05 and Port is 05 !!! [2017-01-10 20:07:32]

The Server's HostName is 192.168.10.12 and Port is 12 !!! [2017-01-10 20:07:32]  2次

The Server's HostName is 192.168.10.02 and Port is 02 !!! [2017-01-10 20:07:33]

The Server's HostName is 192.168.10.06 and Port is 06 !!! [2017-01-10 20:07:33]

The Server's HostName is 192.168.10.13 and Port is 13 !!! [2017-01-10 20:07:33]  3次

The Server's HostName is 192.168.10.03 and Port is 03 !!! [2017-01-10 20:07:34]

The Server's HostName is 192.168.10.07 and Port is 07 !!! [2017-01-10 20:07:34]

The Server's HostName is 192.168.10.14 and Port is 14 !!! [2017-01-10 20:07:34]  4次The Server's HostName is 192.168.10.08 and Port is 08 !!! [2017-01-10 20:07:35]  5次The Server's HostName is 192.168.10.09 and Port is 09 !!! [2017-01-10 20:07:36]  6次The Server's HostName is 192.168.10.10 and Port is 10 !!! [2017-01-10 20:07:37]  7次ok

python多线程加速for循环_Python多线程循环相关推荐

  1. python哨兵循环_Python通用循环的构造方法实例分析

    本文实例讲述了python通用循环的构造方法.分享给大家供大家参考,具体如下: 1.交互循环 是无限循环的一种,允许用户通过交互的方式程序的特定部分: def main(): sum =0.0 cou ...

  2. python with循环_Python for循环、while循环

    Python中有两种循环,分别为:for循环和while循环. for循环 for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次).for循环的基本结 ...

  3. python中while的用法_Python—while循环,内涵五种九九乘法表

    while语句 while循环是一个条件循环语句,如果while后的条件为真时,代码块一直循环,直到条件不再为真则结束循环. while循环的语法如下: while expression: suite ...

  4. python支持什么循环_Python的循环

    Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来,看例子: names = ['Michael', 'Bob', 'Tracy'] for name ...

  5. python 重新执行本次循环_python重新循环

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python的循环编写程序时经常有代码需要重复运行,python提供了while ...

  6. python变量名称跟着循环_Python 变量循环

    Python 变量-循环 一.变量 不管什么编程语言或脚本语言 在定义变量时都有一定的规则.Python变量定义规则如下: 变量名只能是字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 关键 ...

  7. python多线程实现for循环_Python多线程实现同时执行两个while循环

    如果想同时执行两个while True循环,可以使用多线程threading来实现. 完整代码 #coding=gbk from time import sleep, ctime import thr ...

  8. python可以开多少线程_python多线程详解

    python多线程详解 一.线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一 ...

  9. python多线程写同一个文件_Python多线程快速写入文件,python,飞速

    Python多线程快速写入文件,python,飞速 发表时间:2020-07-10 乱序多线程写入 举个最简单的例子,只要求快速写入即可,对顺序无要求时: import threading def w ...

最新文章

  1. haproxy LVS nginx的比较
  2. mysql 修改某列数据_mysql修改表某列数据问题
  3. Opencv java 二值化函数threshold (10)
  4. Java HasCode equals == 的区别
  5. pandas的DataFrame用法
  6. C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符
  7. Qt Creator编辑2D内容
  8. oc随笔四:NSString、NSNumber
  9. 循环,函数,指针作业
  10. 计算机无法播放,如果无法播放计算机mp4文件怎么办?
  11. python17个常见问题_Python 常见的17个错误分析
  12. LeetCode-697. 数组的度
  13. ubuntu 16.04 nfs服务的搭建
  14. 物联网卡焊接式和插拔式各有什么优势
  15. 目标检测(二十)--Mask R-CNN
  16. [lua]紫猫lua教程-命令宝典-L1-01-11. lua的个人补充
  17. java远古时代-驯龙骑士破解版_驯龙骑士apk下载_驯龙骑士安卓游戏v1.12.0-游迅网...
  18. goeasy java_Java GoEasy 实现服务端推送和Web端推送
  19. python跑完代码后怎么办_2017/06/14跑成功了的代码,FYI
  20. 通过 api 调用检查具体日期是否为法定节假日

热门文章

  1. cocos2dx读取excel文件
  2. 区块链信用机制与应用场景介绍
  3. 超实用!年薪40W的项目经理都在用的6个项目管理软件
  4. 乌鲁木齐2021高考成绩查询时间,2021新疆高考成绩公布时间
  5. 教你如何申请域名和解析域名
  6. 布隆过滤器简单实现添加和判断功能
  7. 腾讯可视化, 低代码生成器,正式开源!
  8. 黑苹果,蓝牙折腾经历
  9. mscs下oracle数据库安装
  10. minix模拟android,MINIX NEO Z64小型PC上市,预装Android OS