main函数

Python实例浅谈之五Python守护进程和脚本单例运行

匆匆过客 提交于 2020-01-31 06:00:08
一、简介 守护进程最重要的特性是后台运行;它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等;它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,也可以有作业规划进程crond启动,还可以由用户终端(通常是shell)执行。 Python 有时需要保证只运行一个脚本实例,以避免数据的冲突。 二、Python守护进程 1、函数实现 [html] view plain copy #!/usr/bin/env python #coding: utf-8 import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了 所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有chdir()和umask()了 ''' def daemonize ( stdin= '/dev/null', stdout= '/dev/null', stderr= '/dev/null'): #重定向标准文件描述符(默认情况下定向到/dev/null) try: pid = os.fork() #父进程(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。 if pid > 0: sys.exit(0)

Java编程的逻辑 (11) - 初识函数

情到浓时终转凉″ 提交于 2020-01-29 21:12:41
本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接 : http://item.jd.com/12299018.html 函数 前面几节我们介绍了数据的基本类型、基本操作和流程控制,使用这些已经可以写不少程序了。 但是如果需要经常做某一个操作,则类似的代码需要重复写很多遍,比如在一个数组中查找某个数,第一次查找一个数,第二次可能查找另一个数,每查一个数,类似的代码都需要重写一遍,很罗嗦。另外,有一些复杂的操作,可能分为很多个步骤,如果都放在一起,则代码难以理解和维护。 计算机程序使用 函数这个概念来解决这个问题,即 使用函数来减少重复代码和分解复杂操作,本节我们就来谈谈Java中的函数,包括函数的基础和一些细节。 定义函数 函数这个概念,我们学数学的时候都接触过,其基本格式是 y = f(x),表示的是x到y的对应关系,给定输入x,经过函数变换 f,输出y。程序中的函数概念与其类似,也有输入、操作、和输出组成,但它表示的一段子程序,这个子程序有一个名字,表示它的目的(类比f),有零个或多个参数(类比x),有可能返回一个结果(类比y)。我们来看两个简单的例子: public static int sum(int a, int b){ int sum = a +

最新Python异步编程详解

久未见 提交于 2020-01-29 09:00:20
我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的呢? 简单的回答是Python通过协程(coroutine)来实现异步编程。那究竟啥是协程呢?这将是一个很长的故事。 故事要从yield开始说起(已经熟悉yield的读者可以跳过这一节)。 yield yield是用来生成一个生成器的(Generator), 生成器又是什么呢?这又是一个长长的story,所以这次我建议您移步到这里: 完全理解Python迭代对象、迭代器、生成器 ,而关于yield是怎么回事,建议看这里: [翻译]PYTHON中YIELD的解释 好了,现在假设你已经明白了yield和generator的概念了,请原谅我这种不负责任的说法但是这真的是一个很长的story啊! 总的来说,yield相当于return,它将相应的值返回给调用next()或者send()的调用者,从而交出了cpu使用权,而当调用者再调用next()或者send()时,又会返回到yield中断的地方,如果send有参数,又会将参数返回给yield赋值的变量,如果没有就跟next()一样赋值为None。但是这里会遇到一个问题,就是嵌套使用generator时外层的generator需要写大量代码

30 python 并发编程之多线程

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-29 02:49:41
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 二 开启线程的两种方式 1 #方式一 2 from threading import Thread 3 import time 4 def sayhi(name): 5 time.sleep(2) 6 print('%s say hello' %name) 7 8 if __name__ == '__main__': 9 t=Thread(target=sayhi,args=('egon',)) 10 t.start() 11 print('主线程') 方法一 1 #方式二 2 from threading import Thread 3 import time 4 class Sayhi(Thread): 5 def __init__(self,name): 6 super().__init__() 7 self.name=name 8 def run(self): 9 time.sleep(2) 10 print('%s say hello' % self.name) 11 12

java笔记五:多线程的使用

两盒软妹~` 提交于 2020-01-29 01:44:47
  以前学习基础的时候学习了一段时间的多线程,上课的时候老师也讲过一遍,那时候感觉学的似懂非懂。因为到现在很长一段时间没有用到多线程的知识,所以现在基本上忘了差不多了。但是下个星期要面试了,所以今天特意又研究了一下多线程,免得被问到多线程问题时什么都不记得了那就麻烦了。现在对java比较熟悉了,所以再一次学习多线程知识,感觉没有那么难了(记得刚接触多线程的时候,感觉非常吃力)。   首先讲一下进程和线程的区别:     进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。     线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。     线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。     多进程是指操作系统能同时运行多个任务(程序)。     多线程是指在同一程序中有多个顺序流在执行。   在java中创建一个线程有两种方法:     ①实现java.lang.Runnable接口,重写run()方法,启动:new Thread(this).start()。 1 package com.thread; 2 3 public class ThreadTest1 { 4 public static void main(String[] args) { 5

Go 每日一库之 flag

霸气de小男生 提交于 2020-01-29 00:11:31
缘起 我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态。写博客是一种方式,但不是每天都有想写的,值得写的东西。有时候一个技术比较复杂,写博客的时候经常会写着写着发现自己的理解有偏差,或者细节还没有完全掌握,要去查资料,了解了之后又继续写,如此反复。这样会导致一篇博客的耗时过长。 我在每天浏览 思否 、 掘金 和 Github 的过程中,发现一些比较好的想法,有 JS 每日一题 , NodeJS 每日一库 , 每天一道面试题 等等等等。 https://github.com/parro-it/awesome-micro-npm-packages 这个仓库收集 NodeJS 小型库,一天看一个不是梦!这也是我这个系列的灵感。我计划每天学习一个 Go 语言的库,输出一篇介绍型的博文。每天一库当然是理想状态,我心中的预期是一周 3-5 个。 今天是第一天,我们从一个基础库聊起————Go 标准库中的 flag 。 简介 flag 用于解析命令行选项。有过类 Unix 系统使用经验的童鞋对命令行选项应该不陌生。例如命令 ls -al 列出当前目录下所有文件和目录的详细信息,其中 -al 就是命令行选项。 命令行选项在实际开发中很常用,特别是在写工具的时候。 指定配置文件的路径,如 redis-server ./redis.conf 以当前目录下的配置文件 redis

华为牛客网刷题笔记(一)

送分小仙女□ 提交于 2020-01-28 21:42:58
前言 春节因为新冠状病毒肺炎,无事可做,立志刷题。借此机会,学习下C++语言,如下是刷题记录,力争每道题都记录好思路和代码实现。 No.1 字符串最后一个单词的长度 题目描述 计算字符串最后一个单词的长度,单词以空格隔开。 输入描述: 一行字符串,非空,长度小于5000。 输出描述: 整数N,最后一个单词的长度。 示例1 输入 hello world 输出 5 思路 这个题目比较简单,用C语言的strtok找到空格,用另一个指针记录最后一次空格的位置 #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char buf[5000]; char *p; char *pre; while(NULL != fgets(buf, sizeof(buf)-1, stdin)) { if(buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = 0; p = strtok(buf, " "); pre = p; while(p != NULL) { pre = p; p = strtok(NULL, " "); } printf("%d\r\n", strlen(pre)); } return 0; } No2. 计算字符个数 题目描述 写出一个程序

unittest框架

做~自己de王妃 提交于 2020-01-28 13:07:58
About unittest是Python内置的单元测试框架(模块),不仅可以完成单元测试,也适用于web自动化测试中。 unittest提供了丰富的断言方法,判断测试用例是否通过,然后生成测试结果报告。 必要的准备与注意事项 首先,我们准备这样一个目录: M:\tests\ # 我的是M盘的tests目录,所有操作都在tests目录内完成 ├─discover │ ├─son │ │ ├─test_dict.py │ │ └─__init__.py │ ├─test_list.py │ ├─test_str.py │ └─__init__.py ├─loadTestsFromTestCaseDemo │ └─loadTestsFromTestCaseDemo.py ├─case_set.py ├─myMain.py # 代码演示文件,所有演示脚本文件 ├─test_tuple.py └─__init__.py 如果你跟我的流程走, 请务必建立和理解这样的一个目录,目前这些文件都是空的,后续会一一建立,各目录内的 __init__.py 也必须建立,虽然它是空的,但是它无比重要,因为它标明它所在目录是Python的包。 case_set.py 有4个函数,分别计算加减乘除,并且代码不变: """ 用例集 """ def add(x, y): """ 两数相加 """ return

OC-Block的本质

给你一囗甜甜゛ 提交于 2020-01-28 05:19:15
1.block的本质 block其实就是封装了函数调用以及环境变量调用的对象。 2.block的定义 return_type (^blockName)(parameters) 3.block的本质结构 新建工程,在main.m中添加如下的代码: int age = 10; void (^blockame)(void) = ^{ NSLog(@"logBlock = %d", age); }; blockame(); 用命令行将main.m转成c++的语言,如下: xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m 生成的main.cpp打开,查看如下: 从上图可以看出,c++把block转成了__main_block_impl_0 这种结构体。 C++命名block是有格式的,格式如下:__XXX类名_block定义所在的方法名_block_impl_0 ,与block相关的结构体命名大致都类似 。 __main_block_impl_0 结构体定义如下: 其中, __main_block_impl_0 这个结构体有三个属性:__block_impl结构体类型的 impl、__main_block_desc_0结构类型的desc,还有外部获取到的变量 age。从定义中可知:把fp赋值给了impl的FuncPtr

串口接收中断不起作用的问题

对着背影说爱祢 提交于 2020-01-28 04:02:08
这两天重新开始学STM32, 调试串口,配置好了串口接收中断,却怎么也不起作用,后来经过检查师main函数结束了, 程序已经停止来, 在main函数的结尾加while(1)循环,串口中断正常了。 来源: CSDN 作者: 一缕阳光best 链接: https://blog.csdn.net/a1015392344/article/details/103883837