我有一个服务器在后台运行一个线程,我使用python -i启动它,所以我可以得到一个交互式控制台,我可以输入命令并轻松调试它.但是当我按下Ctrl-D时,由于服务器仍在后台线程中运行,因此控制台不会退出.如何捕获Ctrl-D事件以便我可以关闭服务器并正常退出?我知道如何用信号捕获Ctrl-C,但是由于我按下Ctrl-D的习惯,我通常得到一个"卡住"的终端,这真的很烦人.
谢谢!
服务器代码(简化)是这样的:
import threading
import atexit
class WorkerThread(threading.Thread):
def __init__(self):
super(WorkerThread, self).__init__()
self.quit = False
def run(self):
while not self.quit:
pass
def stop(self):
self.quit = True
def q():
print "Goodbye!"
t.stop()
atexit.register(q)
t = WorkerThread()
t.start()
Run Code Online (Sandbox Code Playgroud)
然后我使用python -i test.py运行它以获得一个python控制台.
我创建了一个TFRecord格式的数据集进行测试.每个条目包含200个列,名为C1- C199,每个都是字符串列表,以及一个label用于表示标签的列.创建数据的代码可以在这里找到:https://github.com/codescv/tf-dist/blob/8bb3c44f55939fc66b3727a730c57887113e899c/src/gen_data.py#L25
然后我使用线性模型来训练数据.第一种方法如下:
dataset = tf.data.TFRecordDataset(data_file)
dataset = dataset.prefetch(buffer_size=batch_size*10)
dataset = dataset.map(parse_tfrecord, num_parallel_calls=5)
dataset = dataset.repeat(num_epochs)
dataset = dataset.batch(batch_size)
features, labels = dataset.make_one_shot_iterator().get_next()
logits = tf.feature_column.linear_model(features=features, feature_columns=columns, cols_to_vars=cols_to_vars)
train_op = ...
with tf.Session() as sess:
sess.run(train_op)
Run Code Online (Sandbox Code Playgroud)
完整的代码可以在这里找到:https://github.com/codescv/tf-dist/blob/master/src/lr_single.py
当我运行上面的代码时,我得到0.85步/秒(批量大小为1024).
在第二种方法中,我手动从Dataset获取批处理到python,然后将它们提供给占位符,如下所示:
example = tf.placeholder(dtype=tf.string, shape=[None])
features = tf.parse_example(example, features=tf.feature_column.make_parse_example_spec(columns+[tf.feature_column.numeric_column('label', dtype=tf.float32, default_value=0)]))
labels = features.pop('label')
train_op = ...
dataset = tf.data.TFRecordDataset(data_file).repeat().batch(batch_size)
next_batch = dataset.make_one_shot_iterator().get_next()
with tf.Session() as sess:
data_batch = sess.run(next_batch)
sess.run(train_op, …Run Code Online (Sandbox Code Playgroud) 我正在实现一个接受许多并发连接的服务器.
我使用了这个结构:
loop(Sock) ->
case gen_tcp:accept(Sock) of
{ok, CSock} ->
fork_handling_process(CSock);
{error, Reason} ->
do_something_else();
end,
loop(Sock).
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人给我发送了一个SYN,但是从来没有向我发送一个SYN ACK来响应我的服务器ACK,我的服务器是否会被该客户端永远阻止,因为我调用了gen_tcp:accept而没有超时?
顺便说一下,我认为这种情况很难效仿,所以如果你有办法试试,请告诉我.
Thx提前.
我使用mnesia为用户存储数据,记录是一个结构像的包
{ username, field1, filed2, timestamp }
Run Code Online (Sandbox Code Playgroud)
为了不让数据库爆炸,我想对属于某个用户的记录数设置一个限制,比如说,如果一个用户的记录数达到500,那么在a之前删除时间戳最旧的记录插入新记录。
有没有一种有效的方法来做到这一点?
提前致谢。
我有以下定义:
def f: Option[String] = Some(null)
Run Code Online (Sandbox Code Playgroud)
以下评估为无:
for {x:String <- f} yield {
x
}
Run Code Online (Sandbox Code Playgroud)
以下评估为Some(null):
for {x <- f} yield {
x
}
Run Code Online (Sandbox Code Playgroud)
以下评估为Some(null):
f.map((x:String) => x)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么它们之间存在差异?
我使用io:format将消息记录到磁盘.每条消息都类似于[{field1,Content1},{field2,Content2},...].
当我使用io:format("〜p",[Msg])打印它时,文件看起来像[{field1,<< 123,456,789,... >>},...].
但我想以原始形式打印unicode字符串,而不是整数数组.我该怎么办?