当前位置: 首页 > news >正文

设计师看什么网站做融资的网站有哪些

设计师看什么网站,做融资的网站有哪些,地方网站开发,广东手机网页制作一、普通线程池 1.1 线程池概念 线程池#xff1a;一种线程使用模式。线程过多会带来调度开销#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价… 一、普通线程池 1.1 线程池概念  线程池一种线程使用模式。线程过多会带来调度开销进而影响缓存局部性和整体性能。而线程池维护着多个线程等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价用空间换时间的一种策略。线程池不仅能够保证内核的充分利用还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 * 线程池的应用场景 * 1. 需要大量的线程来完成任务且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务使用线程池技术是非常合适的。因为单个任务小而任务数量巨大你可以想象一个热门网站的点击次数。 但对于长时间的任务比如一个Telnet连接请求线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。 * 2. 对性能要求苛刻的应用比如要求服务器迅速响应客户请求。 * 3. 接受突发性的大量请求但不至于使服务器因此产生大量线程的应用。突发性大量客户请求在没有线程池情况下将产生大量线程虽然理论上大部分操作系统线程数目最大值不是问题短时间内产生大量线程可能使内存到达极限 出现错误. * 线程池示例也是一个生产消费模型 * 1. 创建固定数量线程池循环从任务队列中获取任务对象 * 2. 获取到任务对象后执行任务对象中的任务接口 1.2 线程池的实现 线程池 #pragma once#include iostream #include vector #include string #include queue #include pthread.h #include unistd.hstruct ThreadInfo {pthread_t tid;std::string name; };static const int defalutnum 5;template class T class ThreadPool { public:void Lock(){pthread_mutex_lock(mutex_);}void Unlock(){pthread_mutex_unlock(mutex_);}void Wakeup(){pthread_cond_signal(cond_);}void ThreadSleep(){pthread_cond_wait(cond_, mutex_);}bool IsQueueEmpty(){return tasks_.empty();}std::string GetThreadName(pthread_t tid){for (const auto ti : threads_){if (ti.tid tid)return ti.name;}return None;}public:static void *HandlerTask(void *args){ThreadPoolT *tp static_castThreadPoolT *(args);std::string name tp-GetThreadName(pthread_self());while (true){tp-Lock();while (tp-IsQueueEmpty()){tp-ThreadSleep();}T t tp-Pop();tp-Unlock();t();std::cout name run, result: t.GetResult() std::endl;}}void Start(){int num threads_.size();for (int i 0; i num; i){threads_[i].name thread- std::to_string(i 1);pthread_create((threads_[i].tid), nullptr, HandlerTask, this);}}T Pop(){T t tasks_.front();tasks_.pop();return t;}void Push(const T t){Lock();tasks_.push(t);Wakeup();Unlock();}private:ThreadPool(int num defalutnum) : threads_(num){pthread_mutex_init(mutex_, nullptr);pthread_cond_init(cond_, nullptr);}~ThreadPool(){pthread_mutex_destroy(mutex_);pthread_cond_destroy(cond_);} private:std::vectorThreadInfo threads_;std::queueT tasks_;pthread_mutex_t mutex_;pthread_cond_t cond_; }; 如果我们将线程的方法写在类内我们的phread方法没法传参数因为类成员函数默认会携带this指针   所以我们不想要这个this指针就必须把这个成员函数变成静态的 但是还不够因为如果我们把他定义成静态成员函数那么他是无法使用类内的非静态成员函数的因此我们如果要解决这个问题我们就可以将this对象通过参数传递过去这样的话我们就可以在静态函数内通过这个对象去调用类内的非静态成员方法了 既然我们这些函数都写在类内了那么我们就可以将一些函数封装一下从而增加代码的可读性  主函数 #include iostream #include ctime #include ThreadPool.hpp #include Task.hpppthread_spinlock_t slock;int main() {// pthread_spin_init(slock, 0);// pthread_spin_destroy(slock);// 如果获取单例对象的时候也是多线程获取的呢std::cout process runn... std::endl;sleep(3);ThreadPoolTask *tp new ThreadPoolTask(5);srand(time(nullptr) ^ getpid());while(true){//1. 构建任务int x rand() % 10 1;usleep(10);int y rand() % 5;char op opers[rand()%opers.size()];Task t(x, y, op);tp-Push(t);//2. 交给线程池处理std::cout main thread make task: t.GetTask() std::endl;sleep(1);} } 任务函数 #pragma once #include iostream #include stringstd::string opers-*/%;enum{DivZero1,ModZero,Unknown };class Task { public:Task(){}Task(int x, int y, char op) : data1_(x), data2_(y), oper_(op), result_(0), exitcode_(0){}void run(){switch (oper_){case :result_ data1_ data2_;break;case -:result_ data1_ - data2_;break;case *:result_ data1_ * data2_;break;case /:{if(data2_ 0) exitcode_ DivZero;else result_ data1_ / data2_;}break;case %:{if(data2_ 0) exitcode_ ModZero;else result_ data1_ % data2_;} break;default:exitcode_ Unknown;break;}}void operator ()(){run();}std::string GetResult(){std::string r std::to_string(data1_);r oper_;r std::to_string(data2_);r ;r std::to_string(result_);r [code: ;r std::to_string(exitcode_);r ];return r;}std::string GetTask(){std::string r std::to_string(data1_);r oper_;r std::to_string(data2_);r ?;return r;}~Task(){}private:int data1_;int data2_;char oper_;int result_;int exitcode_; }; 二、c模式封装线程库 C其实是提供了线程库的但是他的底层也是用的原生线程库做封装所以也必须指定链接。 #pragma once#include iostream #include string #include ctime #include pthread.htypedef void (*callback_t)();//函数指针 static int num 1;class Thread { public:static void *Routine(void *args){Thread* thread static_castThread*(args);thread-Entery();return nullptr;} public:Thread(callback_t cb):tid_(0), name_(), start_timestamp_(0), isrunning_(false),cb_(cb){}void Run(){name_ thread- std::to_string(num);start_timestamp_ time(nullptr);isrunning_ true;pthread_create(tid_, nullptr, Routine, this);}void Join(){pthread_join(tid_, nullptr);isrunning_ false;}std::string Name(){return name_;}uint64_t StartTimestamp(){return start_timestamp_;}bool IsRunning(){return isrunning_;}void Entery(){cb_();}~Thread(){} private:pthread_t tid_;std::string name_;uint64_t start_timestamp_;//启动的时间戳bool isrunning_;//是否启动了callback_t cb_;//线程方法 }; 问题如果我们的线程方法想带参数怎么办 ——改一下构造函数多增加一个类对象将参数传递给这个类对象然后再在方法里面将这个类对象传递给线程函数 主函数 #include iostream #include unistd.h #include vector #include Thread.hppusing namespace std;void Print() {while(true){printf(haha, 我是一个封装的线程...\n);sleep(1);} }int main() {std::vectorThread threads;for(int i 0 ;i 10; i){threads.push_back(Thread(Print));}for(auto t : threads){t.Run();}for(auto t : threads){t.Join();}// Thread t(Print);// t.Run();// cout 是否启动成功: t.IsRunning() endl;// cout 启动成功时间戳: t.StartTimestamp() endl;// cout 线程的名字: t.Name() endl;// t.Join();return 0; } 三、线程安全的单例模式 3.1 单例模式和设计模式  单例模式是一种 经典的, 常用的, 常考的 设计模式. IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是设计模式 单例模式的特点  某些类, 只应该具有一个对象(实例), 就称之为单例. 例如一个男人只能有一个媳妇. 在很多服务器开发场景中, 经常需要让服务器加载很多的数据 (上百G) 到内存中. 此时往往要用一个单例的类来管理这些数据. 3.2 饿汉模式和懒汉模式  吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭. 吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗, 就是懒汉方式. 懒汉方式最核心的思想是 延时加载. 从而能够优化服务器的启动速度  例子1我们申请内存的时候首先是在地址空间上申请而当我们真正要使用的时候才会发生缺页中断从而建立虚拟地址和物理地址的映射关系  例子2我们打开文件的时候文件的属性必然会先被加载起来但是文件的内容则是我们需要使用的时候才会加载进来  饿汉方式实现单例模式  template typename T class Singleton { static T data; public: static T* GetInstance() { return data; } }; 只要通过 Singleton 这个包装类来使用 T 对象, 则一个进程中只有一个 T 对象的实例. 懒汉方式实现单例模式  template typename T class Singleton { static T* inst; public: static T* GetInstance() { if (inst NULL) { inst new T(); } return inst; } }; 存在一个严重的问题, 线程不安全. 第一次调用 GetInstance 的时候, 如果两个线程同时调用, 可能会创建出两份 T 对象的实例. ——所以我们必须加锁  可是我们我们会发现其实也就第一次调用的时候可能会出现这种情况但是后续再次调用, 基本上都是直接返回所以加锁就没有什么意义了还大大降低效率——解决方法外面再加一层判断 // 懒汉模式, 线程安全 template typename T class Singleton { volatile static T* inst; // 需要设置 volatile 关键字, 否则可能被编译器优化. static std::mutex lock; public: static T* GetInstance() { if (inst NULL) { // 双重判定空指针, 降低锁冲突的概率, 提高性能. lock.lock(); // 使用互斥锁, 保证多线程情况下也只调用一次 new. if (inst NULL) { inst new T(); } lock.unlock(); } return inst; } }; 注意事项: 1. 加锁解锁的位置 2. 双重 if 判定, 避免不必要的锁竞争 3. volatile关键字防止过度优化 3.3 懒汉模式的线程池修改  #pragma once#include iostream #include vector #include string #include queue #include pthread.h #include unistd.hstruct ThreadInfo {pthread_t tid;std::string name; };static const int defalutnum 5;template class T class ThreadPool { public:void Lock(){pthread_mutex_lock(mutex_);}void Unlock(){pthread_mutex_unlock(mutex_);}void Wakeup(){pthread_cond_signal(cond_);}void ThreadSleep(){pthread_cond_wait(cond_, mutex_);}bool IsQueueEmpty(){return tasks_.empty();}std::string GetThreadName(pthread_t tid){for (const auto ti : threads_){if (ti.tid tid)return ti.name;}return None;}public:static void *HandlerTask(void *args){ThreadPoolT *tp static_castThreadPoolT *(args);std::string name tp-GetThreadName(pthread_self());while (true){tp-Lock();while (tp-IsQueueEmpty()){tp-ThreadSleep();}T t tp-Pop();tp-Unlock();t();std::cout name run, result: t.GetResult() std::endl;}}void Start(){int num threads_.size();for (int i 0; i num; i){threads_[i].name thread- std::to_string(i 1);pthread_create((threads_[i].tid), nullptr, HandlerTask, this);}}T Pop(){T t tasks_.front();tasks_.pop();return t;}void Push(const T t){Lock();tasks_.push(t);Wakeup();Unlock();}static ThreadPoolT *GetInstance(){if (nullptr tp_) // ???{pthread_mutex_lock(lock_);if (nullptr tp_){std::cout log: singleton create done first! std::endl;tp_ new ThreadPoolT();}pthread_mutex_unlock(lock_);}return tp_;}private:ThreadPool(int num defalutnum) : threads_(num){pthread_mutex_init(mutex_, nullptr);pthread_cond_init(cond_, nullptr);}~ThreadPool(){pthread_mutex_destroy(mutex_);pthread_cond_destroy(cond_);}ThreadPool(const ThreadPoolT ) delete;const ThreadPoolT operator(const ThreadPoolT ) delete; // abc private:std::vectorThreadInfo threads_;std::queueT tasks_;pthread_mutex_t mutex_;pthread_cond_t cond_;static ThreadPoolT *tp_;static pthread_mutex_t lock_; };template class T ThreadPoolT *ThreadPoolT::tp_ nullptr;template class T pthread_mutex_t ThreadPoolT::lock_ PTHREAD_MUTEX_INITIALIZER; 四、STL、智能指针和线程安全 STL中的容器是否是线程安全的? —— 不是. 原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶). 因此 STL默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全. 智能指针是否是线程安全的? 对于 unique_ptr, 由于只是在当前代码块范围内生效, 因此不涉及线程安全问题. 对于 shared_ptr, 多个对象需要共用一个引用计数变量, 所以会存在线程安全问题. 但是标准库实现的时候考虑到了这个问题, 基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数. 五、其他各种锁 悲观锁在每次取数据时总是担心数据会被其他线程修改所以会在取数据前先加锁读锁写锁行 锁等当其他线程想要访问数据时被阻塞挂起。(我们使用的一般都是这个) 乐观锁每次取数据时候总是乐观的认为数据不会被其他线程修改因此不上锁。但是在更新数据前 会判断其他数据在更新前有没有对数据进行修改。主要采用两种方式版本号机制和CAS操作。 CAS操作当需要更新数据时判断当前内存值和之前取得的值是否相等。如果相等则用新值更新。若不等则失败失败则重试一般是一个自旋的过程即不断重试。 自旋锁公平锁非公平锁 自旋锁的介绍 讲个故事张三发现明天要考试了非常慌于是打电话找到了李四让李四帮他复习一下李四说我目前还在看书还得等我一个小时于是这个时候张三就先去学校旁边的网吧打了一个小时的游戏等打完回来正好李四下来了 于是一起去复习了 最后考了60分。 第二次又考试了这次张三还是一样打电话给李四这个时候李四说他上个厕所就下来了这个时候你想的是他一会就下来了那我还是在这等等吧就不去网吧了。 所以这个时候张三决策的依据就是李四究竟要让他等多久 —— 当前其他申请不到锁的进程是应该阻塞还是应该重复申请取决于其执行临界区代码的时长 所以我们以前学的锁叫做挂起等待锁而需要不断申请直到获得的锁叫做自旋锁 实现方式trylock加锁就是如果当前没有加锁成功就直接返回 所以我们只要在外围封装一个while循环那么该线程就会一直申请锁直到申请成功 但其实pthread库给我们实现了一个自旋锁 第一个就是相当于帮我们封装了这个while循环他会一直申请直到申请到锁。 第二个就跟前面学的差不多只要申请失败了就会返回  六、读者写者问题、 6.1 引入 读者写者问题本身也是生产消费者模型 遵循321原则但是其中最大的一个差别就是  读和读是共享关系因为读的过程并不会影响到数据比如我们学校的黑板报或者博客 线程库为我们提供了读写锁 一般来说都是读的多写的少所以读的竞争能力比写的竞争能力大很多所以可能会导致写较大概率的饥饿问题中性现象  有两种策略读者优先和写者优先            优先就是当两者一块来的时候让其中一方先进去 线程库的读写锁默认是读者优先  6.2 读写锁接口 设置读写优先 int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref); /* pref 共有 3 种选择 PTHREAD_RWLOCK_PREFER_READER_NP (默认设置) 读者优先可能会导致写者饥饿情况 PTHREAD_RWLOCK_PREFER_WRITER_NP 写者优先目前有 BUG导致表现行为和 PTHREAD_RWLOCK_PREFER_READER_NP 一致 PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 写者优先但写者不能递归加锁 */ 初始化 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr); 销毁 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);   加锁和解锁 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);   6.3 样例代码 #include vector #include sstream #include cstdio #include cstdlib #include cstring #include unistd.h #include pthread.h volatile int ticket 1000; pthread_rwlock_t rwlock; void * reader(void * arg) { char *id (char *)arg; while (1) { pthread_rwlock_rdlock(rwlock); if (ticket 0) { pthread_rwlock_unlock(rwlock); break; } printf(%s: %d\n, id, ticket); pthread_rwlock_unlock(rwlock); usleep(1); } return nullptr; } void * writer(void * arg) { char *id (char *)arg; while (1) { pthread_rwlock_wrlock(rwlock); if (ticket 0) { pthread_rwlock_unlock(rwlock); break; } printf(%s: %d\n, id, --ticket); pthread_rwlock_unlock(rwlock); usleep(1); } return nullptr; } struct ThreadAttr { pthread_t tid; std::string id; }; std::string create_reader_id(std::size_t i) { // 利用 ostringstream 进行 string 拼接 std::ostringstream oss(thread reader , std::ios_base::ate); oss i; return oss.str(); } std::string create_writer_id(std::size_t i) { // 利用 ostringstream 进行 string 拼接 std::ostringstream oss(thread writer , std::ios_base::ate); oss i; return oss.str(); } void init_readers(std::vectorThreadAttr vec) { for (std::size_t i 0; i vec.size(); i) { vec[i].id create_reader_id(i); pthread_create(vec[i].tid, nullptr, reader, (void *)vec[i].id.c_str()); } } void init_writers(std::vectorThreadAttr vec) { for (std::size_t i 0; i vec.size(); i) { vec[i].id create_writer_id(i); pthread_create(vec[i].tid, nullptr, writer, (void *)vec[i].id.c_str()); } } void join_threads(std::vectorThreadAttr const vec) { // 我们按创建的 逆序 来进行线程的回收 for (std::vectorThreadAttr::const_reverse_iterator it vec.rbegin(); it ! vec.rend(); it) { pthread_t const tid it-tid; pthread_join(tid, nullptr); } } void init_rwlock() { #if 0 // 写优先 pthread_rwlockattr_t attr; pthread_rwlockattr_init(attr); pthread_rwlockattr_setkind_np(attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); pthread_rwlock_init(rwlock, attr); pthread_rwlockattr_destroy(attr); #else // 读优先会造成写饥饿 pthread_rwlock_init(rwlock, nullptr); #endif } int main() { // 测试效果不明显的情况下可以加大 reader_nr // 但也不能太大超过一定阈值后系统就调度不了主线程了 const std::size_t reader_nr 1000; const std::size_t writer_nr 2; std::vectorThreadAttr readers(reader_nr); std::vectorThreadAttr writers(writer_nr); init_rwlock(); init_readers(readers); init_writers(writers); join_threads(writers); join_threads(readers); pthread_rwlock_destroy(rwlock); } makefile main: main.cpp g -stdc11 -Wall -Werror $^ -o $ -lpthread
文章转载自:
http://www.morning.jkcpl.cn.gov.cn.jkcpl.cn
http://www.morning.bbgr.cn.gov.cn.bbgr.cn
http://www.morning.mdgb.cn.gov.cn.mdgb.cn
http://www.morning.tkfnp.cn.gov.cn.tkfnp.cn
http://www.morning.mbbgk.com.gov.cn.mbbgk.com
http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn
http://www.morning.spwm.cn.gov.cn.spwm.cn
http://www.morning.dydqh.cn.gov.cn.dydqh.cn
http://www.morning.hxpsp.cn.gov.cn.hxpsp.cn
http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn
http://www.morning.rqlzz.cn.gov.cn.rqlzz.cn
http://www.morning.srnth.cn.gov.cn.srnth.cn
http://www.morning.brqjs.cn.gov.cn.brqjs.cn
http://www.morning.ykrck.cn.gov.cn.ykrck.cn
http://www.morning.fkffr.cn.gov.cn.fkffr.cn
http://www.morning.ljngm.cn.gov.cn.ljngm.cn
http://www.morning.mwhqd.cn.gov.cn.mwhqd.cn
http://www.morning.tbstj.cn.gov.cn.tbstj.cn
http://www.morning.ktdqu.cn.gov.cn.ktdqu.cn
http://www.morning.nlbw.cn.gov.cn.nlbw.cn
http://www.morning.zhnyj.cn.gov.cn.zhnyj.cn
http://www.morning.zcwtl.cn.gov.cn.zcwtl.cn
http://www.morning.rywn.cn.gov.cn.rywn.cn
http://www.morning.flfxb.cn.gov.cn.flfxb.cn
http://www.morning.qkrqt.cn.gov.cn.qkrqt.cn
http://www.morning.qggcc.cn.gov.cn.qggcc.cn
http://www.morning.xkyfq.cn.gov.cn.xkyfq.cn
http://www.morning.ynlbj.cn.gov.cn.ynlbj.cn
http://www.morning.npkrm.cn.gov.cn.npkrm.cn
http://www.morning.qwdlj.cn.gov.cn.qwdlj.cn
http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn
http://www.morning.vibwp.cn.gov.cn.vibwp.cn
http://www.morning.tnwgc.cn.gov.cn.tnwgc.cn
http://www.morning.rqsnl.cn.gov.cn.rqsnl.cn
http://www.morning.hous-e.com.gov.cn.hous-e.com
http://www.morning.mingjiangds.com.gov.cn.mingjiangds.com
http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn
http://www.morning.pnmtk.cn.gov.cn.pnmtk.cn
http://www.morning.fhxrb.cn.gov.cn.fhxrb.cn
http://www.morning.gccrn.cn.gov.cn.gccrn.cn
http://www.morning.qtqk.cn.gov.cn.qtqk.cn
http://www.morning.ygkk.cn.gov.cn.ygkk.cn
http://www.morning.bqwnp.cn.gov.cn.bqwnp.cn
http://www.morning.kzcfp.cn.gov.cn.kzcfp.cn
http://www.morning.drmbh.cn.gov.cn.drmbh.cn
http://www.morning.kfcz.cn.gov.cn.kfcz.cn
http://www.morning.pqryw.cn.gov.cn.pqryw.cn
http://www.morning.nlrxh.cn.gov.cn.nlrxh.cn
http://www.morning.zfqdt.cn.gov.cn.zfqdt.cn
http://www.morning.rfrxt.cn.gov.cn.rfrxt.cn
http://www.morning.kpygy.cn.gov.cn.kpygy.cn
http://www.morning.hgbzc.cn.gov.cn.hgbzc.cn
http://www.morning.rtbhz.cn.gov.cn.rtbhz.cn
http://www.morning.kzqpn.cn.gov.cn.kzqpn.cn
http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn
http://www.morning.qgjgsds.com.cn.gov.cn.qgjgsds.com.cn
http://www.morning.wnrcj.cn.gov.cn.wnrcj.cn
http://www.morning.knngw.cn.gov.cn.knngw.cn
http://www.morning.wxgd.cn.gov.cn.wxgd.cn
http://www.morning.ftldl.cn.gov.cn.ftldl.cn
http://www.morning.rfxw.cn.gov.cn.rfxw.cn
http://www.morning.mpwgs.cn.gov.cn.mpwgs.cn
http://www.morning.jghty.cn.gov.cn.jghty.cn
http://www.morning.mrxqd.cn.gov.cn.mrxqd.cn
http://www.morning.mcjxq.cn.gov.cn.mcjxq.cn
http://www.morning.zzhqs.cn.gov.cn.zzhqs.cn
http://www.morning.xqbbc.cn.gov.cn.xqbbc.cn
http://www.morning.guangda11.cn.gov.cn.guangda11.cn
http://www.morning.kwksj.cn.gov.cn.kwksj.cn
http://www.morning.lanyee.com.cn.gov.cn.lanyee.com.cn
http://www.morning.wpcfm.cn.gov.cn.wpcfm.cn
http://www.morning.zstry.cn.gov.cn.zstry.cn
http://www.morning.dqrpz.cn.gov.cn.dqrpz.cn
http://www.morning.zrdqz.cn.gov.cn.zrdqz.cn
http://www.morning.jlrym.cn.gov.cn.jlrym.cn
http://www.morning.nhdmh.cn.gov.cn.nhdmh.cn
http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn
http://www.morning.fpyll.cn.gov.cn.fpyll.cn
http://www.morning.lmhwm.cn.gov.cn.lmhwm.cn
http://www.morning.tgmwy.cn.gov.cn.tgmwy.cn
http://www.tj-hxxt.cn/news/236425.html

相关文章:

  • 怎么在自己做的网站上发视频教程如何建立自己的公司
  • 企业网站源码利于优化做网站构思
  • 网站开发前台实训奉化市建设局网站
  • 羊 东莞网站开发科技服务网站建设内容
  • 不建立网站建设的利弊wordpress插件自定义字段
  • 网站建设如何为企业电商化转型赋能建站公司外包
  • 河北网站建设seo优化制作设计crm系统架构图
  • 万江网站制作广州市专注网站建设公司
  • 漯河网站建设服务公司郑州网站高端设计
  • 东莞网站制作的公司视频解析网站怎么做的
  • 做百度移动网站吗wordpress多语言插件
  • 在线营销型网站制作个人网站页面设计素材
  • 在哪个网站做图片视频带音乐云南档案馆网站建设资金
  • 网站建设用图片多少钱算有钱
  • 个人网站快速备案建材 网站 案例
  • 网站建设外包公司容易被客户投诉吗四川省的住房和城乡建设厅网站
  • 做网站的流量怎么算钱企业装修展厅公司
  • 网站建设及外包杭州富阳做网站
  • 景区网站建设方案 费用电商 wordpress主题
  • 网站证书怎么做网页版式设计分析
  • dede 两个网站图片路径模板公司
  • 如何提交网站给百度福州大型网站设计公司
  • 网站建设外包服务广告设计专业有哪些
  • 虚拟主机代理商的网站打不开了怎么办高端品牌网站建设电商网站设计
  • 阿里巴巴有几个网站是做外贸的旅行社网站怎么做
  • 网站建设如何更改背景图片四川旅游seo整站优化
  • 资阳网站设计做网站干什么
  • 网站后台数据采集澧县网页设计
  • 微信小程序跳转到网站网站首页怎么做全屏swf
  • 如何建设商城网站wordpress使用方法