小编Chi*_*ang的帖子

如何在python交互式控制台中捕获"Ctrl-D"?

我有一个服务器在后台运行一个线程,我使用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控制台.

python console

8
推荐指数
1
解决办法
1万
查看次数

使用feed_dict比使用数据集API快5倍?

我创建了一个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)

tensorflow tensorflow-datasets

7
推荐指数
1
解决办法
2657
查看次数

是gen_tcp:accept/1安全吗?

我正在实现一个接受许多并发连接的服务器.

我使用了这个结构:

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提前.

sockets erlang

5
推荐指数
1
解决办法
233
查看次数

在mnesia中限制某个键下记录数的惯用方法是什么?

我使用mnesia为用户存储数据,记录是一个结构像的包

{ username, field1, filed2, timestamp }
Run Code Online (Sandbox Code Playgroud)

为了不让数据库爆炸,我想对属于某个用户的记录数设置一个限制,比如说,如果一个用户的记录数达到500,那么在a之前删除时间戳最旧的记录插入新记录。

有没有一种有效的方法来做到这一点?

提前致谢。

erlang mnesia limit

5
推荐指数
1
解决办法
190
查看次数

关于Scala的解释与Option的理解

我有以下定义:

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)

我想知道为什么它们之间存在差异?

scala for-comprehension

5
推荐指数
1
解决办法
599
查看次数

通过PID杀死Erlang中的进程

我正在Erlang中实现一个聊天服务器.根据我的设计,每个客户端在服务器节点上都有一个相应的代理进程来处理消息.我正在将代理的PID写入数据库,以便我可以在它们之间交换消息.

杀死PID时是否安全?例如,在我的服务器重新启动之后,PID仍然在数据库中(但进程将死掉),数据库中的PID是否有可能与其他一些(新创建的)重要进程冲突?

如果是这样,我不能简单地在客户端没有响应时终止代理.到目前为止,我还没有观察到它,但肯定知道这将是很好的.

erlang

2
推荐指数
1
解决办法
640
查看次数

erlang如何打印unicode字符串?

我使用io:format将消息记录到磁盘.每条消息都类似于[{field1,Content1},{field2,Content2},...].

当我使用io:format("〜p",[Msg])打印它时,文件看起来像[{field1,<< 123,456,789,... >>},...].

但我想以原始形式打印unicode字符串,而不是整数数组.我该怎么办?

unicode erlang

2
推荐指数
1
解决办法
6854
查看次数