兩種情況:
1,同步函數(shù)
這個(gè)簡(jiǎn)單,順序執(zhí)行就可以了
2,異步函數(shù)(我猜你是這種情況)async await可以解決
async function a() {
return Promise.resolve("a");
}
async function b() {
return Promise.resolve("b");
}
async function c() {
await a();
await b();
console.log('執(zhí)行c')
}
c();你把這個(gè)看成一個(gè)數(shù)學(xué)問(wèn)題
階乘是什么?
f(1) = 1
f(n) = n * f(n-1)
所以就是
def f(n):
if n <= 0:
return 0
if n == 1:
return 1
return n * f(n-1)tox, github上有N多個(gè)不同平臺(tái)的客戶(hù)端, 支持實(shí)時(shí)音視頻
example 3 是擴(kuò)展性比較好的寫(xiě)法。說(shuō)擴(kuò)展性好是指在增加新的 Data 類(lèi)型時(shí)不要改動(dòng)任何代碼。第二種模板的方式要求 Data 類(lèi)型必須具有一致的結(jié)構(gòu)才可以,太脆弱了。
example 3 的問(wèn)題是對(duì)使用者不友好,每次調(diào)用都要寫(xiě) lambda, 如果有大量的調(diào)用就顯得代價(jià)過(guò)高了??梢酝ㄟ^(guò)提取輔助函數(shù)的方式解決(或者寫(xiě)成 User 類(lèi)的構(gòu)造函數(shù)),每增加一個(gè) Data 類(lèi)型就對(duì)應(yīng)增加這樣一個(gè)輔助函數(shù)(或者構(gòu)造函數(shù))
當(dāng)然,以上只適合示例代碼中這種簡(jiǎn)單邏輯。實(shí)際項(xiàng)目中可能復(fù)雜的多,比如要訪(fǎng)問(wèn)十幾種 Data 類(lèi)型中的十幾個(gè)成員,這時(shí)候就有必要加一個(gè)抽象層了,所有的 User 類(lèi)從一個(gè)公共的接口繼承下來(lái),每種或者每幾種 Data 類(lèi)型對(duì)應(yīng)一種實(shí)現(xiàn)?;蛘甙殉橄蠼涌诜旁趦?nèi)部,User 類(lèi)作為對(duì)該抽象接口調(diào)用的一個(gè)包裝類(lèi),這種方式的好處是抽象層在內(nèi)部可以隨時(shí)修改。
具體怎么做只能具體問(wèn)題具體分析了。
書(shū)上也許有錯(cuò)誤的地方。你理解也有不準(zhǔn)確的地方。其實(shí)你都可以自己實(shí)驗(yàn)得到。
tell單獨(dú)用,指的是整個(gè)數(shù)組。但放入一些表達(dá)式中時(shí),會(huì)被隱式轉(zhuǎn)換為第一個(gè)元素的指針。
cout << sizeof(tell) << endl; // 輸出20,即整個(gè)數(shù)組的大小
cout << sizeof(tell + 1) << endl; // 輸出4或8,即一個(gè)指針的大?。?2位或64位的指針大小不同)
cout << tell << endl; // 輸出一個(gè)地址
cout << tell + 1 << endl; // 比上一個(gè)地址大2,即1個(gè)short的大小
&tell沒(méi)有懸念,指的是指向整個(gè)數(shù)組的指針。
cout << &tell << endl; // 輸出一個(gè)地址
cout << &tell + 2 << endl; // 比上一個(gè)地址大40
至于short (*)[20],沒(méi)見(jiàn)過(guò)這樣的寫(xiě)法。
int fac(int &&a, int &&b) {
if (b == 0)
return a > 0 ? fac(a-1, 0) * a : 1;
return fac(a+b, 0);
}
int fac(int &&a, int &&b) {
if (a > 0)
return fac(a-1, b+0) * (a+b);
else if (b > 0)
return fac(a+0, b-1) * (a+b);
else
return 1;
}析構(gòu)函數(shù)忘定義了
其實(shí)這個(gè)問(wèn)題,很簡(jiǎn)單,分析一下就知道了。分析如下:
var str = "我是/@小王@\\和/@小李@\\的好朋友"
你要轉(zhuǎn)成
var arr = [{"text": "我是"}, {"name": 小王"}, {"text": "和"}, {"name": "小李"}, {"text": "的好朋友"}]
以我看來(lái)就是,通過(guò)/@和@\把字符串分割,并且以/@結(jié)尾的放到text屬性中,以@\結(jié)尾的放到name中,并且保持原有順序。
既然是有兩個(gè)分割字符,那么我們就分割兩次。我簡(jiǎn)單寫(xiě)了一下,但是沒(méi)有做太多檢驗(yàn)和判斷。回頭你對(duì)參數(shù)做下校驗(yàn)。
我的代碼如下:
var str = "我是/@小王@\\和/@小李@\\的好朋友";
var strs = str.split("/@");
var arr = new Array();
for (var i = 0 ;i < strs.length;i++)
{
if(strs[i].indexOf('@\\') != -1)
{
var temps = strs[i].split('@\\');
for(var j=0;j<temps.length;j++)
{
if(j == temps.length -1)
{
var text =
{
text:temps[j]
}
}else
{
var name =
{
name:temps[j]
}
}
}
}else
{
var text =
{
text:strs[i]
}
}
if(name != null && '' != name && 'undifined' != name)
{
arr.push(name);
}
if(text != null && '' != text && 'undifined' != text)
{
arr.push(text);
}
}
console.log(arr);
那么,最后控制臺(tái)輸入如下:
如果沒(méi)問(wèn)題,請(qǐng)采納,謝謝。
補(bǔ)充一個(gè)使用循環(huán)的實(shí)現(xiàn)
現(xiàn):保證數(shù)組的序列是有序的連續(xù)的
$data = [
['AAA', 'aaa', 'aAa'],
['BBB', 'bbb', 'bBb'],
['CCC', 'ccc', 'cCc'],
];
$result = [];
foreach (array_keys($data) as $k) {
$tmp = [];
if (empty($result)) {
$result = $data[$k];
} else {
foreach ($result as $item1) {
foreach ($data[$k] as $item2) {
$tmp[] = $item1 . '-' . $item2;
}
}
$result = $tmp;
}
}
var_dump($result);如果構(gòu)造函數(shù)返回了一個(gè)“對(duì)象”,那么這個(gè)對(duì)象會(huì)取代整個(gè)new出來(lái)的結(jié)果。
var aa = new a(name);
也就是說(shuō) aa 就是{say1:say}這個(gè)對(duì)象了,他是不具有say2的!
張老師寫(xiě)過(guò)文章:http://www.cnblogs.com/shanyo...
C#版本的話(huà),我用過(guò)WkHtmlToXSharp 和[WkHtmlToXDotNet](https://github.com/TimothyKho...
前者用的人比較多,后者一般般.
注意一點(diǎn),不要在IIS中使用WkHtmlToXSharp方案,有內(nèi)存泄漏風(fēng)險(xiǎn),在桌面環(huán)境就隨便玩了;
直接調(diào)用wkhtmltopdf.exe的話(huà)就無(wú)所謂了.
你nm命令看到的那些符號(hào)的“U”表示未定義的,你可以看到它們前面沒(méi)有內(nèi)存地址信息,這些符號(hào)是定義在你引入的mxml庫(kù)中的。
你是在生成可執(zhí)行程序main的失敗報(bào)錯(cuò)的吧,如果是在編譯的時(shí)候再加上-lmxml選項(xiàng),并使用-L選項(xiàng)指定mxml庫(kù)所在的目錄。
運(yùn)行時(shí)可能會(huì)遇到提示找不到libmxml.so**庫(kù)的錯(cuò)誤提示,可以把libmxml.so**庫(kù)發(fā)布到/usr/lib64目錄下,或者把libmxml.so**所在目錄配置到/etc/ld.so.conf中,然后執(zhí)行l(wèi)dconfig即可。
*.cpp文件沒(méi)有加入CMakeLists.txt中, 檢查一下這個(gè)文件吧.
@felix 老大已經(jīng)完全解答了OP你的問(wèn)題, 窩稍微做點(diǎn)微不足道的補(bǔ)充:
foo此時(shí)會(huì)對(duì)所有X<T>可見(jiàn). 那么就等于X<int>間接不合理的獲取了所有X<T>的信息(比如其private member). 所以不建議使用, 比如下段代碼可以過(guò)編譯.#include<iostream>
using namespace std;
template<typename T>
class A
{
private:
T x;
void setter(T y)
{
x = y;
}
public:
explicit A(T a) : x(a) {}
template<typename U>
friend void foo(A<U> a);
};
A<int> x(7);
template<typename U>
void foo(A<U> a)
{
x.x = 2;
}
int main()
{
A<int> a(7);
A<float> b(1.1);
foo(b);
}
首先靜態(tài)成員變量count需要在類(lèi)外定義從c++1z開(kāi)始可能需要改成首先non-constexpr的靜態(tài)成員變量count需要在類(lèi)外定義。詳見(jiàn)http://eel.is/c++draft/depr.s... . demo可以在寫(xiě)個(gè)odr-use函數(shù)試出.#include<iostream>
using namespace std;
template<class T, int n>
class Array;
template<class T, int n>
istream & operator>> (istream & in, Array<T,n>& a);
template<class T,int n>
ostream & operator << (ostream & out,const Array<T,n>& a);
template<class T, int n>
class Array
{
private:
T p[n];
static int count;
public:
friend istream & operator>> <> (istream & in, Array<T,n>& a);
friend ostream & operator << <> (ostream & out,const Array<T,n>& a);
int getSize()
{
return n;
}
static int getArrayCount()
{
return count;
}
};
template<class T,int n>
istream & operator >> (istream & in, Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
in>>a.p[i];
}
a.count++;
return in;
}
template<class T,int n>
ostream & operator << (ostream & out,const Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
out<<a.p[i]<<" ";
}
return out;
}
template<class T, int n>
int Array<T, n>::count = 0;
int main()
{
Array< int, 5 > intArray1;
cin >> intArray1;
Array< int, 5 > intArray2;
cin >> intArray2;
Array< float, 5 > floatArray;
cin >> floatArray;
cout << "\nIntArray1 contains " << intArray1.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray1;
cout << "\nIntArray2 contains " << intArray2.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray2;
cout << "\nDoubleArray contains " << floatArray.getSize() << " Elements.\n";
cout << "The values in the doubleArray are:\n";
cout << floatArray;
cout << "\nThere are " << Array<int,5>::getArrayCount() << " Array<int,5> objects.\n";
cout << "\nThere are " << Array<float,5>::getArrayCount() << " Array<float,5> objects.\n";
return 0;
}如果確定是計(jì)算密集確實(shí)不適合使用python中的多線(xiàn)程,但是是可以考慮使用多進(jìn)程的。你不需要通過(guò)自己創(chuàng)建一個(gè)queue來(lái)進(jìn)行內(nèi)部分流,即使需要一個(gè)Queue, 也是需要通過(guò)給Queue設(shè)置大小來(lái)限制Queue的流量。
以rabbitmq為例, 請(qǐng)看https://www.rabbitmq.com/tuto...
在rabbitmq的官方例子中,是使用pika做為rabbitmq的客戶(hù)端的, 消息模型應(yīng)該是和你的是一致的,稍微修改一下官方的work.py例子,通過(guò)建立多個(gè)rabbitmq客戶(hù)端來(lái)消費(fèi)消息:
#!/usr/bin/env python
import pika
import time
from concurrent.futures import ProcessPoolExecutor
# from concurrent.futures import ThreadPoolExecutor
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channels = [
(1, connection.channel(1)),
(2, connection.channel(2)),
(3, connection.channel(3)),
]
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
time.sleep(0.2)
print(" [x] Done: %s" % ch.channel_number)
ch.basic_ack(delivery_tag=method.delivery_tag)
for _, channel in channels:
channel.queue_declare(queue='task_queue', durable=True)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback, queue='task_queue')
def start_consumer(channel_name):
dict(channels).get(channel_name).start_consuming()
print(' [*] Waiting for messages. To exit press CTRL+C')
with ProcessPoolExecutor(max_workers=len(channels)) as e:
e.map(start_consumer, range(1, 4))
# with ThreadPoolExecutor(max_workers=len(channels)) as e:
# e.map(start_consumer, range(1, 4))
彈性的創(chuàng)建worker我覺(jué)的從程序(worker.py)內(nèi)部去實(shí)現(xiàn)是比較困難的,從程序外部來(lái)看更容易實(shí)現(xiàn), 首先監(jiān)控流量, 流量增大可以通過(guò)啟動(dòng)更多的worker.py腳本來(lái)加快消息的消費(fèi); 反之, 減少worker.py啟動(dòng)的數(shù)量。
很簡(jiǎn)單的問(wèn)題,npm這個(gè)報(bào)錯(cuò)我也是服了,就是flash這個(gè)用戶(hù)名被注冊(cè)過(guò)了,換一個(gè)就好了,我解決了在這里記錄一下,怕以后忘了...
設(shè)置心跳檢測(cè)時(shí)間試試
array(
'heartbeat_idle_time' => 600,
'heartbeat_check_interval' => 60,
借花獻(xiàn)佛
https://blog.csdn.net/u010003...
另外MongoDB 4.0已經(jīng)開(kāi)始支持事務(wù)了
只有0和-1才能這樣初始化吧
后面你維護(hù)的時(shí)候,原則上只需要保證那些暴露出去的方法的兼容性即可。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。