在我的应用程序中,我需要查看新文件的目录.流量非常大,每秒至少会有数百个新文件出现.目前我正在使用这种想法的繁忙循环:
while True:
time.sleep(0.2)
if len(os.listdir('.')) > 0:
# do stuff
Run Code Online (Sandbox Code Playgroud)
运行性能分析后,我看到很多时间都在睡眠中,我想知道是否应该改变它来使用轮询.
我正在尝试使用其中一个可用的类select来轮询我的目录,但我不确定它是否真的有效,或者我是否只是做错了.
我为我的目录获得了一个fd:
fd = os.open('.', os.O_DIRECT)
Run Code Online (Sandbox Code Playgroud)
然后我尝试了几种方法来查看目录何时更改.举个例子,我尝试过的一件事是:
poll = select.poll()
poll.register(fd, select.POLLIN)
poll.poll() # returns (fd, 1) meaning 'ready to read'
os.read(fd, 4096) # prints largely gibberish but i can see that i'm pulling the files/folders contained in the directory at least
poll.poll() # returns (fd, 1) again
os.read(fd, 4096) # empty string - no more data
Run Code Online (Sandbox Code Playgroud)
为什么poll()表现得有更多的信息需要阅读?我假设只有在目录中发生了某些变化时才会这样做.
我想在这里做什么甚至可能吗?
如果没有,还有其他更好的选择while True: look for changes吗?
到目前为止,我对应用程序从各处的典型点击事件处理程序转换到完成GUI解耦的过程非常满意.现在我遇到了一些我无法弄清楚的东西,它与我想要弹出GUI的窗口有关,它需要显示模型中的信息.
我想我的问题的简短版本是,在MVVM中绝对禁止允许模型引用ViewModel吗?这是我的场景:我有一组LED可以非常快速地循环显示RGB值.我想在我的GUI中有一个窗口,通过使用ViewModel进行数据绑定来显示更新的颜色.我在测试应用程序中使用模型ViewModel使Window + UserControl正常工作,但现在我必须将此Window放入我的实际应用程序中.
我正在运行的特定模式模拟硬件正在做什么.当我命令模型循环遍历颜色时,它会启动一个更改必要的类成员变量值的线程.
我目前对MVVM的实现基本上都是轮询.为了让其他LED在其他地方更新,我运行了一个调用ViewModel函数的线程.这会更新属性,因此GUI会自动更新,因为我正在使用数据绑定.我的LED示例中的问题是模拟颜色序列是在线程中完成的,因此如果我需要对值进行ViewModel轮询,则由于LED变量的过度锁定,它可能会很慢.
因此,我希望有人可以推荐另一种解决此问题的方法.到目前为止,我唯一能想到的就是让Window datacontext成为一个LEDViewModel,然后将LEDViewModel传递给Model.然后当我调用RGB循环函数时,它可以根据需要更改必要的ViewModel属性,我根本不需要使用任何锁定.
这有意义吗?任何建议都会非常感激.
我必须在一个处理大约1000个描述符poll(我不能使用epoll它特定于Linux),我必须能够动态添加/删除它们(处理新连接并删除关闭).
这意味着我应该在每次迭代时重新组合描述符数组.
从技术角度来看,这是显而易见的,但有人知道这样做的一种美妙方式吗?
我正在构建一个处理数据后异步发送邮件的系统(处理过程可能需要10秒钟)。
我最初的想法是让Windows服务每3秒对数据库进行一次数据处理请求轮询,以处理第一条记录。完成后,轮询并获取要处理的新的第一条记录。
如果没有记录,请等待3秒钟,然后再次轮询以检查记录。
我不确定这是否是个好主意。我认为使用计时器不是编程的好方法。另外,即使在不需要时,数据库的性能和使用也很重要。
在这种情况下,最佳做法是什么?
使用的技术:.net 3.5,SQL Server,服务器处于服务器场中。
我需要这个服务器能够监听并与客户建立新的连接,同时写入现有的连接..即.异步非阻塞i/o.我被告知使用poll()但是在花费了大量时间之后只是试图掌握套接字编程,我仍然不确定如何实现poll()函数.
int sockfd;
int main(int argc, char *argv[])
{
int newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
while(1){
newsockfd = …Run Code Online (Sandbox Code Playgroud) 我正在玩RXJava,在Android中进行改造.我正在努力完成以下任务:
我需要定期轮询一个给我一个Observable的调用>(从这里我可以做到)
一旦我得到这个列表,我想迭代每个交付,并调用另一个方法,将给我ETA(所以只是更多信息)我想将这个新信息附加到交付,并返回完整列表与附加的额外信息每个物品.
一旦得到列表,我知道如何在没有rxjava的情况下做到这一点,但我想练习.
到目前为止这是我的代码:
pollDeliveries = Observable.interval(POLLING_INTERVAL, TimeUnit.SECONDS, Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))
.map(tick -> RestClient.getInstance().getApiService().getDeliveries())
.doOnError(err -> Log.e("MPB", "Error retrieving messages" + err))
.retry()
.subscribe(deliveries -> {
MainApp.getEventBus().postSticky(deliveries);
});
Run Code Online (Sandbox Code Playgroud)
这给了我一份交货清单.现在我想完成第二部分.
希望我足够清楚.谢谢
我正在尝试JSON.parse数组“数据”。我需要能够将数组作为根传递。
{
"data": [
{
"type": "name",
"id": "123"
}
]
}
Run Code Online (Sandbox Code Playgroud)
响应看起来应该只包含对象。Zapier似乎不适用于数组。
{
"type": "name",
"id": "123"
}
Run Code Online (Sandbox Code Playgroud)
我不应该能够使用简单的脚本来完成工作吗?
编辑:
本质上,您将要在脚本编写中覆盖post_poll方法(https://zapier.com/developer/documentation/v2/scripting/#polling),以便可以拦截API的响应。之后,您只需要返回一个具有所需值的新对象。无需返回:{“ data”:[{...},{...},]},您只需要返回data的值。就像是:
xyz_post_poll: function(bundle){
var response = JSON.parse(bundle.response.content);
return response.data || [];
}
Run Code Online (Sandbox Code Playgroud) 我想在Jenkins中检查或获取有关SCM轮询失败的通知(例如,当存储库URL已更改或分支被删除时).我想到了这些:
a)Jenkins控制台脚本,它将列出这些错误的工作
b)为Jenkins配置/安装插件以某种方式通知我这个事实(电子邮件,任何东西)
c)外部脚本/可执行文件(bash,python,...),它将列出由于SCM轮询失败而在过去X小时内失败的构建
这是我一直使用Threads/BackgroundWorker的东西,但我正在尝试迁移到Task的做事方式.
假设我有一个第三方SDK用于从USB端口读取字节.如果没有读取字节,则读取调用将阻塞并在100 ms后超时,返回null.如果读取字节,它会立即返回,返回读取字节的byte []数组.
所以我基本上需要一遍又一遍地轮询,并通过调用解析函数对接收到的字节采取措施.它是一个WPF应用程序,因此返回的字节应该能够传递给UI线程函数.
这样做的正确方法是什么?这是我到目前为止,它似乎工作,但我想确保它是使用TPL做事的正确方法:
private void _connectUsbButton_Click(object sender, RoutedEventArgs e)
{
ListenForUsbMessagesAsync();
}
private async void ListenForUsbMessagesAsync()
{
while (true)
{
byte[] readBytes = await ReadBytesAsync();
Parse(readBytes);
}
}
private Task<byte[]> ReadBytesAsync()
{
Task<byte[]> readBytesTask = Task.Run(() =>
{
byte[] bytes;
do
{
bytes = ReadBytes();
} while (bytes == null);
return bytes;
});
return readBytesTask;
}
private byte[] ReadBytes()
{
byte[] readBytes = _usbSdk.ReadBytes(); //100ms timeout (returns null if no bytes read)
return readBytes;
}
Run Code Online (Sandbox Code Playgroud) 在具有两个git存储库的Jenkinsfile中,这些是在单个Jenkins作业中使用多个GIT存储库的示例:
node {
dir('RepoOne') {
git url: 'https://github.com/somewhere/RepoOne.git'
}
dir('RepoTwo') {
git url: 'https://github.com/somewhere/RepoTwo.git'
}
sh('. RepoOne/build.sh')
sh('. RepoTwo/build.sh')
}
Run Code Online (Sandbox Code Playgroud)
如何配置此作业以跟踪这两个存储库的SCM更改,以便每次至少有一个存储库具有更新时触发该作业?
问题在于,作业不是轮询Jenkinsfile内提到的存储库,而是轮询Jenkinsfile本身的存储库(它存储在特殊的存储库中,而不是与源代码一起存储),这是在作业的GUI配置中提到的。
使用旧的Jenkins(无编码管道)和SVN插件,这非常容易,因为可以在GUI配置中提及所有N个存储库,将其检出到单个工作空间的单独子目录并同时进行轮询。
如何使用GIT + Jenkins Pipeline-As-Code获得相同的结果?我尝试在Jenkinsfile中也使用“ poll:true”选项,但没有帮助。那么此选项有什么作用?
更新1:这是我真正使用的管道脚本,但是它不起作用:
properties([
pipelineTriggers([
scm('H/5 * * * *')
])
])
node {
stage ('Checkout') {
dir('cplib') {
git(
poll: true,
url: 'ssh://git@<server>:<port>/base/cplib.git',
credentialsId: 'BlueOceanMsl',
branch: 'master'
)
}
dir('cpmffmeta') {
git(
poll: true,
url: 'ssh://git@<server>:<port>/base/cpmffmeta.git',
credentialsId: 'BlueOceanMsl',
branch: 'master'
)
}
}
stage ('Build') {
...
}
Run Code Online (Sandbox Code Playgroud)