我有几个Lua脚本可以在文本文件和控制台中运行经验并输出大量信息.我想在控制台输出中添加一些颜色,以使其更具可读性.
我知道可以使用ANSI转义序列为bash脚本的输出着色.例如 :
$ echo -e "This is red->\e[00;31mRED\e[00m"
Run Code Online (Sandbox Code Playgroud)
我试图在Lua做同样的事情:
$ lua -e "io.write('This is red->\\e[00;31mRED\\e[00m\n')"
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我也试过print()而不是io.write(),但结果是一样的.
我正在编写一个Python脚本,pycurl用于使用Twitter的Sreaming API.这是一个简短的代码片段(只需将您的Twitter登录名/密码进行测试):
import pycurl
user = 'USER'
password = 'PWD'
def handleData(data):
print(data)
conn = pycurl.Curl()
conn.setopt(pycurl.USERPWD, "%s:%s" % (user, password))
conn.setopt(pycurl.URL, 'https://stream.twitter.com/1/statuses/sample.json')
conn.setopt(pycurl.WRITEFUNCTION, handleData)
conn.perform()
Run Code Online (Sandbox Code Playgroud)
问题是因为脚本使用流,所以conn.perform()永远不会返回(或很少).因此,我有时需要中断脚本,并且KeyboardInterrupt被perform()方法捕获.
但是,它不能很好地处理它,打印出一个丑陋的错误,并引发一个不同的异常.
^CTraceback (most recent call last):
File "test.py", line 6, in handleData
def handleData(data):
KeyboardInterrupt
Traceback (most recent call last):
File "test.py", line 12, in <module>
conn.perform()
pycurl.error: (23, 'Failed writing body (0 != 2203)')
Run Code Online (Sandbox Code Playgroud)
该卷曲FAQ说,中断正在进行的转移,回调函数(在我的情况handleData),应返回的特殊值.这很棒,但是KeyboardInterrupt没有被任何回调功能捕获!
我怎么能整齐地做到这一点? …
我有一个自定义线程池类,它创建一些线程,每个线程等待自己的事件(信号).将新作业添加到线程池时,它会唤醒第一个空闲线程,以便它执行该作业.
问题如下:我有大约1000个循环,每个循环大约10'000次迭代.这些循环必须按顺序执行,但我有4个CPU可用.我尝试做的是将10'000次迭代循环分成4个2'500次迭代循环,即每个线程一次.但是我必须等待4个小循环才能完成下一个"大"迭代.这意味着我无法捆绑作业.
我的问题是使用线程池和4个线程比顺序执行作业要慢得多(由一个单独的线程执行一个循环比直接在主线程中顺序执行它要慢得多).
我在Windows上,所以我创建事件,CreateEvent()然后等待其中一个使用,WaitForMultipleObjects(2, handles, false, INFINITE)直到主线程调用SetEvent().
似乎整个事件(以及使用关键部分的线程之间的同步)非常昂贵!
我的问题是:使用事件花费"很多"时间是否正常?如果是这样,我可以使用另一种机制,而且时间更便宜吗?
下面是一些代码来说明(从我的线程池类复制的一些相关部分):
// thread function
unsigned __stdcall ThreadPool::threadFunction(void* params) {
// some housekeeping
HANDLE signals[2];
signals[0] = waitSignal;
signals[1] = endSignal;
do {
// wait for one of the signals
waitResult = WaitForMultipleObjects(2, signals, false, INFINITE);
// try to get the next job parameters;
if (tp->getNextJob(threadId, data)) {
// execute job
void* output = jobFunc(data.params);
// tell thread pool that we're done and collect output
tp->collectOutput(data.ID, …Run Code Online (Sandbox Code Playgroud) 我有多边形来定义英国各县的轮廓.这些形状非常详细(每个10k到20k点),因此渲染相关的计算(多边形P?中的点X)非常昂贵.
因此,我想"子采样"我的多边形,以获得相似的形状,但点数较少.有什么不同的技术呢?
琐碎的一个是每N一点拿一个(因此用一个因子进行二次抽样N),但这感觉太"粗糙"了.我宁愿做点平均值,也不想做点什么.任何指针?
请考虑以下lua代码段:
local time = os.time()
for _= 1, 10 do
time = time + 1
print('Seeding with ' .. time)
math.randomseed(time)
for i = 1, 5 do
print('\t' .. math.random(100))
end
end
Run Code Online (Sandbox Code Playgroud)
在Linux机器上,结果如预期的那样是随机数.但似乎至少在Mac OS X上,改变种子后的第一个随机数总是一样的!
我猜这与Lua依赖C rand()函数生成随机数这一事实有关,但有人有解释吗?
编辑:这是linux机器上面代码输出的摘录(即输出是预期的):
$ lua test.lua
Seeding with 1232472273
69
30
83
59
84
Seeding with 1232472274
5
21
63
91
27
[...]
Run Code Online (Sandbox Code Playgroud)
在OS X机器上,"Seeding with ..."之后的第一个数字始终为66.
我需要在php中使用正则表达式来匹配元素标签之间的内容,例如<body>和</body>perl兼容preg_match.
到目前为止,我试过:
// $content is a string with html content
preg_match("/<body(.|\r\n)*\/body>/", $content, $matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)
...但打印输出是一个空数组.
可能重复:
Lua中的"主要"功能?
在Python中,您可以非常轻松地检查脚本是否被直接调用(并调用一些函数,如果它通常用于测试):
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
有没有办法在Lua中做同样的事情来检测它是直接运行(lua foo.lua)还是包含在另一个脚本(dofile('foo.lua'))中.
在以前主脚本文件中定义一些虚拟全局变量总是存在琐碎(和丑陋)的方式dofile('foo.lua'),并检查foo.lua它是否已定义,但如果有更好的方法可以做到这一点会很好.
我有一个依赖于MySQL数据库的Web应用程序,我正在考虑构建一个iPhone应用程序.此应用程序将允许用户在Web应用程序上浏览/插入/更新/删除其帐户上的数据.
最简单的方法是将iPhone应用程序简单地构建为Web应用程序的界面,即每个操作都需要连接到Web.但是,我希望iPhone应用程序拥有自己的"离线"版本的数据库.这不仅允许用户离线工作,而且还可以提供更好的体验,因为在本地拥有一切意味着更快,响应更快的应用程序.
我会通过使用时间戳和保持最新的版本(我已经使用了软删除,即当用户删除我只是设置一个标志的记录)处理冲突,但我还没有完全想通了如何处理插入.事实上,如果用户在两个下线(iPhone应用程序)和网络(Web应用程序)的数据库中插入新的项目,会有一个主键冲突(我的所有表有自动递增的主键整数字段).我该如何处理这个问题?
我想的是有一个双列主键,一个是自动递增的整数,第二个是特定于"设备".这样,通过网络应用程序添加的新记录将具有ID 1-web,2-web等,以及通过iPhone应用程序1-iphone,2-iphone等创建的...这将允许合并两者数据库没有冲突.你怎么看待这个想法?
我有一个使用自定义线程池类运行的多线程应用程序.线程都执行相同的功能,具有不同的参数.
这些参数通过以下方式提供给threadpool类:
// jobParams is a struct of int, double, etc...
jobParams* params = new jobParams;
params.value1 = 2;
params.value2 = 3;
int jobId = 0;
threadPool.addJob(jobId, params);
Run Code Online (Sandbox Code Playgroud)
一旦线程无关,它就会获得下一个参数并运行作业功能.我决定删除threadpool类中的参数:
ThreadPool::~ThreadPool() {
for (int i = 0; i < this->jobs.size(); ++i) {
delete this->jobs[i].params;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这样做时,我有时会遇到堆损坏错误:
为RtlFreeHeap指定的地址无效
奇怪的是,在一个案例中它完美地运行,但在另一个程序中它崩溃了这个错误.我尝试在其他地方删除指针:在执行作业功能后的线程中(我得到相同的堆损坏错误)或在作业函数本身结束时(在这种情况下没有错误).
我不明白如何从不同的地方删除相同的指针(我检查,地址是相同的)更改任何东西.这与多线程这一事实有什么关系吗?
我有一个关键部分来处理对参数的访问.我不认为问题是关于同步访问.无论如何,只有在完成所有线程后才会调用析构函数,并且我不会在其他地方删除任何指针.指针可以自动删除吗?
至于我的代码.作业列表是结构的队列,由作业的id(以后能够获得特定作业的输出)和参数组成.
getNextJob() 每次完成执行上一个作业时,线程调用它们(它们都有一个指向ThreadPool的指针).
void ThreadPool::addJob(int jobId, void* params) {
jobData job; // jobData is a simple struct { int, void* }
job.ID = jobId;
job.params = params;
// insert parameters …Run Code Online (Sandbox Code Playgroud) 我有一个使用OpenMP并行化的串行应用程序.我只是将以下内容添加到我的主循环中:
#pragma omp parallel for default(shared)
for (int i = 0; i < numberOfEmitters; ++i)
{
computeTrajectoryParams* params = new computeTrajectoryParams;
// defining params...
outputs[i] = (int*) ComputeTrajectory(params);
delete params;
}
Run Code Online (Sandbox Code Playgroud)
它似乎运行良好:在开始时,我的所有工作线程执行循环的迭代,一切都很快,我有100%的CPU负载(在四核机器上).然而,片刻后,工作线程的一个停止,并保持在一个调用的函数_vcomp::PersistentThreadFunc从vcomp90.dll(该文件vctools\openmprt\src\ttpool.cpp),然后又等......直到只剩下主线程保持工作.
有人知道为什么会这样吗?在大约一半的迭代被执行后,这开始发生.